【问题标题】:Arranging bars of a bar plot with "null" in Descending order in R在R中以降序排列带有“null”的条形图的条形
【发布时间】:2018-06-07 04:51:17
【问题描述】:

我想创建一个带有降序条的条形图,在下面的图中,由于 NA 出现在“a1”向量中的第二个位置,因此在创建图时它被推到最后。但是,我希望 NA 栏只出现在第二个位置,请在这里帮助我,因为我想在不修改数据的情况下实现这一点。

library(ggplot2)
library(plotly)

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)

【问题讨论】:

  • 这看起来与几天前的问题非常相似...stackoverflow.com/questions/47950817/…
  • @Z.Lin,那里的数据框没有 null,所以 stringsasfactors 有效,在这种情况下,问题是 NA 存在,所以建议的解决方案失败,请在这里帮助我。
  • @Z.Lin,我也想显示 NA 值的栏。
  • @Z.Lin,请提出建议,因为我不知道可能的解决方法。
  • 我不明白你的问题。如果存在 NA,为什么您的图表显示 null 而不是 NA?您的问题是与plotly / ggplotly 有关吗,还是仅与ggplot 阶段有关?

标签: r ggplot2 dplyr plotly ggplotly


【解决方案1】:

在 cmets 中,您认为硬编码一个值来替换 NA 是一种不好的做法。我想说按索引位置硬编码是个坏主意,但自动将NA 替换为字符串,例如null,是个好主意。

在下面的例子中,我唯一添加的是a12$a1[is.na(a1)] &lt;- "null"。此行检测NAa12$a1 中的位置,并将其替换为null。基于b1中的数字的reorder会在后面发生,所以这种方法不需要你事先知道NA的索引

library(ggplot2)
library(plotly)

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

# Replace the NA to be "null"
a12$a1[is.na(a1)] <- "null"

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)

【讨论】:

  • 如果我将您的脚本运行到第六行,我再次看到 NA 被硬编码到数据中。我也尝试了这种方法并得到了相同的结果。但这就是我问这个问题的原因是我不能对值进行硬编码,当我们为利益相关者提供解决方案时,我们无权对任何地方的数据应用更改,甚至将“NA”值分配给na 不是一个好习惯,所以请建议我一种没有硬编码的方法,我可以假设它是一个正常的变量值。
  • 就像我在帖子中所说的那样:按索引位置硬编码是一个坏主意,但用字符串自动替换 NA 不是。我不明白你为什么坚持你不能那样做。 NA 是因子级别很难使用,因为在订购因子时它将转到最后一个。用字符串替换NA 是一个合乎逻辑的选择。你可以保持这个帖子打开,看看其他人是否可以提供帮助,但我暂时不会更改我的帖子。
  • 好吧,让我给你一个场景,假设我故意分配值 NA,并说利益相关者在其间更改了他/她的数据,然后对我的解决方案进行验证,这将变得矛盾。因此,我需要一个适当的修复。
  • 当利益相关者更改他们的数据时,如果行包含NA 更改,这无关紧要,因为a12$a1[is.na(a1)] &lt;- "null" 只会更改要绘制的数据框,而不是他们的数据。
  • 我看了你在这里问的问题:stackoverflow.com/questions/47950817/… 基本上我认为马库斯和我有同样的想法。 replace_na 只是替换 NA 值的另一种方式。如果你接受了 markus 的回答,我看不出你为什么不能接受我的回答。
猜你喜欢
  • 1970-01-01
  • 2020-02-28
  • 2017-03-02
  • 2022-11-24
  • 1970-01-01
  • 2020-03-05
  • 2023-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多