我有一个数据框,其中包含一组制造商并为这些制造商收集数据。制造商列表和/或属性数据可能会发生变化,具体取决于运行情况。 我在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
答案 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)