0

嗨,我在尝试仅显示某些子集的标签时遇到了美学错误。例如。

library("ggplot2")
library(gplots)
library(ggrepel)

set.seed(10)
data <- data.frame(label=letters[1:21], number= runif(21, min=0, max=100))
data$label <-factor(data$label)

ggplot(data, aes(x=label, y=number, fill=data$label )) +
geom_bar(stat="identity") +
geom_text_repel(data=  data[data$number > 80,], aes(label =data$label ), 
                  arrow = arrow(length = unit(0.01, 'npc')), box.padding = unit(1.5, 'lines'),color="black"   )

当我这样做时,我收到以下错误

Error: Aesthetics must be either length 1 or the same as the data (2): label, x, y, fill

即使我用向量替换标签,例如c("label1","label2") 我仍然会收到错误消息。

我做错了什么,但我无法弄清楚。我能做到这一点的唯一方法是创建一个具有相同长度的单独向量并将其用作标签,但是我认为有一种方法可以直接进行子集化。谢谢!

4

1 回答 1

3

将代码更改为:

ggplot(data, aes(x=label, y=number, fill=data$label )) +
geom_bar(stat="identity") +
geom_text_repel(data=  data[data$number > 80,], aes(label =label ), ##<- Change here
                  arrow = arrow(length = unit(0.01, 'npc')), box.padding = unit(1.5, 'lines'),color="black"   )

问题是,在调用inside 时aesgeom_text_repel()您使用data$label21 行数据框中的一列,而您希望label在数据的 2 行子集中进行评估。

在这种情况下,您通过调用 data 掩盖了问题,data如果您将其称为更有意义的名称,则可能更容易发现错误。

于 2017-03-20T16:20:45.367 回答