【问题标题】:R ggplot stat_summary: how to include a count of NAs in legend?R ggplot stat_summary:如何在图例中包含 NA 的计数?
【发布时间】:2014-10-20 06:13:10
【问题描述】:

我试图在 x 轴上绘制一个离散变量,在 y 轴上绘制一个连续变量。想象一下,在 mtcars 中,我试图绘制 cyl 与 disp 的图。如果 disp 的某些值是 NA 怎么办?我想知道 cyl 的每个值有多少 NA ,并将其显示在一个简单的表格中,可能就在图例下方(或在图例本身内)。有没有简单(或复杂)的方法来做到这一点?

我提出的类似和相关问题:R - looking at means by subgroup and overall on a line graph

谢谢!

【问题讨论】:

  • 是的,有一个复杂的方法。但请注意,ggplot2 是一个可视化工具。用 ggplot2 做所有事情并不是一个好主意。如果你想要一张桌子,你可以用knitr::kable()table()tables::tabular()等来制作桌子。
  • 如果你可以忍受桌子在情节区域,那么这个Q是stackoverflow.com/questions/12318120/…的骗子——只需用table(is.na(foo$X, foo$Y))或类似的形式制作桌子。 annotation_custom 被裁剪到绘图区域,所以直到我们找到一种方法将注释添加到图例区域......
  • 糟糕。表格构造应该是table(is.na(foo$X),foo$Y) 以获得二维表格。
  • 如何将 NA 的数量添加到图例本身(而不是“正下方”)?即“4 Cyl (3 NAs)”

标签: r graph na


【解决方案1】:

这个答案并不满足所有问题的要求,但是由于关于如何准确呈现数据的细节有点模糊,我还是发布了。

因此,这是一种将 NA 计数添加到图例本身的方法:

library(datasets)
mycars <- mtcars
mycars$disp[c(1,2,3)] <- NA

lvls = levels(as.factor(mycars$cyl))
nacounts <- by(mycars, mycars$cyl, function(x) sum(is.na(x$disp)))
labels = paste(lvls," (NA=",as.integer(nacounts),")",sep="")

ggplot(data=mycars) +
   geom_boxplot(aes(x=cyl,y=disp, fill=as.factor(cyl)))  +
   scale_fill_discrete(name="Cyl", labels=labels)

编辑

关于问题中提到的 stat_summary 图:可以使用 scale_linetype_* 函数添加描述线型的标签。

如果您想拥有与上图相同的图例,我认为您必须添加描述 cyl 的图形元素,例如:

ggplot(mycars,aes(cyl,disp)) +
  stat_summary(fun.y=mean, geom="line", lwd=1.5) +
  stat_summary(aes(lty=factor(vs)),fun.y="mean",geom="line") +
  stat_summary(aes(color=factor(cyl)),fun.y="mean",geom="point",size=5) +
  scale_x_continuous(breaks=c(4,6,8),labels=c("four","6","8")) +
  scale_color_discrete(labels=labels)

【讨论】:

  • 感谢您的回复!是的,在传说中包括 NA 就更好了。我无法适应此处创建的折线图,有什么建议吗?:stackoverflow.com/questions/26452364/…
  • 在您所指的示例中,图例描述了从“vs”参数派生的线型。要更改线型标签,请尝试添加 scale_linetype_manual(例如 scale_linetype_manual(values=c(1,2), labels=c("1","2")))。我会更新答案
  • 谢谢!有什么方法可以将图例的标题从因子(vs)更改为其他名称?我想用 name=. 来改变因子(cyl)标题。
  • 由于因子(vs)图例指的是线型(由 stat_summary 的 lty= 部分生成),您应该在 scale_linetype_* 函数中设置名称。例如尝试添加到情节: scale_linetype_manual(values=c(1,2), labels=c("1","2"), name="vs")
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多