Проблема с na в расположении столбцов на гистограмме в R и ggplot2

Я пытаюсь создать гистограмму с нисходящими столбцами, используя ggplot2 и график в R. Я использую данные «a12», которые используются ggplot под строкой «#Окончательный кадр данных используется ниже».

Если вы видите снимок ниже, значение «na» в столбце «a1» должно стоять на втором месте графика, однако оно не следует убывающему порядку и помещается последним.

Один из способов решить эту проблему — жестко закодировать там значение, но я не хочу этого делать. Вместо этого есть способ, с помощью которого я могу заставить «na» следовать порядку без жесткого кодирования какого-либо значения?

Примечание. Не изменяйте данные над строкой «#Окончательный кадр данных используется ниже». Фактические данные, над которыми я работаю, на самом деле в том же формате. Пожалуйста помоги.

a1 = c("A","","B","C","D","F")
b1 = c(165,154,134,110,94,78)
a12 = data.frame(a1,b1)
a12[2, 1] = "NA"

#Final Data frame is consumed below
pp1 <<- ggplot(a12 , 
               aes(x = reorder(a1, -b1), 
                   y = b1,
                   text = paste("User: <br>", a1, "<br> Days: <br>", round(b1)))) + 
  geom_bar(stat = "identity", fill = "#3399ff" ) + 
  scale_y_continuous(name = "Time") + 
  scale_x_discrete(name = "Employee") 

ggplotly(pp1, tooltip="text", height = 392)

Сценарий дополнения ниже:

a1 = c("A",NA,"B","C","D","F")
b1 = c(165,154,134,110,94,78)
a12 = data.frame(a1,b1,stringsAsFactors = FALSE)
pp1 <<- ggplot(a12 , aes(x = reorder(a1,-b1), y = b1,text=paste("User: 
<br>",a1, "<br> Days: <br>", round(b1)))) + 
geom_bar(stat = "identity", fill = "#3399ff" ) + scale_y_continuous(name 
="Time") + scale_x_discrete(name ="Employee") 
ggplotly(pp1, tooltip="text",height = 392)

введите здесь описание изображения


person Robert J    schedule 23.12.2017    source источник
comment
Установите stringsAsFactors = FALSE в третьей строке.   -  person markus    schedule 23.12.2017
comment
@markus, это сработало, спасибо, я также хочу знать, скажем, у меня есть данные из 1000 строк с несколькими столбцами, имеющими одинаковые значения NA, позаботится ли эта команда обо всех данных?   -  person Robert J    schedule 23.12.2017
comment
пожалуйста, сделайте это новым вопросом, приведя воспроизводимый пример, как вы сделали выше.   -  person markus    schedule 23.12.2017
comment
Я разберусь с этим, очень ценю вашу помощь, я также немного застрял с другой проблемой, в которой мне нужна ваша помощь, пожалуйста, проверьте эту ссылку stackoverflow.com/questions/47951307/   -  person Robert J    schedule 23.12.2017
comment
@markus, если вы замените второе значение в векторе a1 на NA, следующее решение не работает, ниже я прикрепляю сценарий добавления, пожалуйста, запустите и предложите возможное решение.   -  person Robert J    schedule 26.12.2017
comment
Я думаю, вы смешиваете вещи. Вы хотите заменить это значение на NA, т. е. «Недоступно», или на "NA"? Последний создает строку, что вы и сделали в первую очередь.   -  person markus    schedule 26.12.2017
comment
@markus, теперь я буду предельно ясен: я не хочу вносить какие-либо изменения в данные, и создаваемый мной график должен иметь нисходящие полосы, чтобы NA отображалась во второй позиции, как в векторе. Пожалуйста, помогите мне со сценарием в разделе Addon Script ниже:. И снова ни замены, ни модификации данных, спасибо за ответ и просьба помочь.   -  person Robert J    schedule 26.12.2017
comment
Возможный дубликат Расстановка полос гистограмма с нулем в порядке убывания в R   -  person www    schedule 27.12.2017


Ответы (1)


Чтобы расположить столбцы так, как вы хотите, не должно быть пропущенного значения, то есть NA, в df$a1. Нам как-то нужно заменить это отсутствующее значение.

Поскольку вы просили не заменять, не изменять данные в комментариях выше, я предлагаю вам заменить отсутствующие значения внутри вызова ggplot, используя, например, tidyr::replace_na. Это оставит исходные данные без изменений.

library(tidyr)
library(ggplot2)
pp1 <- ggplot(data = replace_na(a12, replace = list(a1 = "NA")),
                      aes(x = reorder(a1, -b1),
                          y = b1,
                          text = paste("User: <br>", a1, "<br> Days: <br>", round(b1)))) +
  geom_bar(stat = "identity", fill = "#3399ff") +
  scale_y_continuous(name = "Time") +
  scale_x_discrete(name = "Employee")

ggplotly(pp1, tooltip = "text",height = 392)

введите здесь описание изображения

Надеюсь, это поможет.

person markus    schedule 26.12.2017