r ggplot更改图例顺序以匹配最终的数据顺序

时间:2017-10-04 15:49:42

标签: r ggplot2 legend-properties

我有一个数据框,其中包含一组制造商并为这些制造商收集数据。制造商列表和/或属性数据可能会发生变化,具体取决于运行情况。 我在ggplot中将其显示为折线图,但我想要的是使图例顺序与最后一年数据的“上/下”顺序相匹配。所以对于这个图表: Default Legend Order

我希望看到传奇顺序(和颜色)是Yoyodyne(紫色),Widget(绿色),Wonka(蓝色)和Acme(红色)。 我不能(或者不认为我可以)使用scale_color_manual作为从一个模型运行到下一个模型的数据输入(在2032年)可能不同和/或制造商列表可能不同。

做图表的代码是(最后一部分,pz,只是为了简化x轴显示):

px <- ggplot(bym, aes(x=Model.Year, y=AverageCost, colour=Manufacturer))
py <- px + ggtitle("MyChart") + labs(x="Year", y="Foo") + geom_line(size=0.5) + geom_point()
pz <- py + scale_x_continuous(breaks=c(min(bym$Model.Year),max(bym$Model.Year)))
pz

2 个答案:

答案 0 :(得分:1)

您是否尝试过根据去年设定制造商的等级?例如,您可以添加以这种方式设置级别的列:

# order Manufacturer by AverageCost in the last year
colours = bym[with(bym[bym$Model.Year == 2032,], order(-AverageCost)),]$Manufacturer
# add factor with levels ordered by colours
bym$Colour = factor(bym$Manufacturer, levels=as.character(colours))

然后使用Colour获取colour美学。

编辑:也就是说,如果你想坚持使用基础R. dplyr::mutate的答案更容易使用。

答案 1 :(得分:1)

您可以使用dplyr::mutate函数和factor函数来设置图例对象的顺序。要按照您想要的顺序设置颜色,您可以按照您想要的顺序创建一个具有所需颜色的矢量,并将它们传递给scale_color_manual。我在下面的例子中做到了这一点。我看起来和你的有点不同,因为我删除了中间作业。

bym <- data.frame(
  Model.Year = rep(seq(2016, 2030, 1), 4),
  AverageCost = rnorm(60),
  Manufacturer = rep(c("Yoyodyne", "Widget", "Wonka", "Acme"), each = 15)
)

my_colors <- c("purple", "green",  "blue", "red")

bym %>%
  mutate(Manufacturer = factor(Manufacturer, 
                               levels = c("Yoyodyne", "Widget", "Wonka",     "Acme"))) %>%
  ggplot(aes(x=Model.Year, y=AverageCost, colour=Manufacturer)) +
  ggtitle("MyChart") + 
  labs(x="Year", y="Foo") + 
  geom_line(size=0.5) + 
  geom_point()+ 
  scale_x_continuous(breaks=c(min(bym$Model.Year),max(bym$Model.Year))) +
  scale_color_manual(values = my_colors)