如何在ggplot中为不同的geom _ *(aes(col =)提供不同的图例和配色方案?

时间:2019-05-16 10:53:09

标签: r ggplot2

此代码显然不起作用(两个分类变量使用相同的图例和配色方案。

require(ggplot2)

dt <- ggplot2::diamonds ; dt <- dt [1:20,];dt 
ggplot(dt) + 
  geom_point(aes(depth,carat, col=cut)) + 
  geom_point(aes(depth,carat, col=clarity)) +
  scale_colour_brewer("greens", name="cut") +  
  scale_colour_brewer("Reds", name="cut") +
  guides(colour= guide_legend("CUT")) + 
  guides(colour = guide_legend("CLARITY"))

绘制此图形的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

没有正确的方法来执行此操作。不能以这种方式使用Ggplot,因为您试图将两个变量映射到相同的比例。但是,您可以劫持填充比例来为您完成这项工作,从而在一定程度上规避ggplot的局限性:

ggplot(dt) +
  geom_point(aes(depth, carat, fill = cut), shape = 21, colour = "transparent") +
  geom_point(aes(depth, carat, colour = clarity)) +
  scale_colour_brewer(palette = "Greens", name = "cut") +
  scale_fill_brewer(palette = "Reds", name = "clarity")

enter image description here

技巧是使用具有填充的形状并使用该填充来映射变量。不利的一面是,这个技巧不能扩展到任何数量的变量。有一些可以实现您想要的功能的软件包,即ggnewscalerelayer

ggnewscale软件包的示例:

library(ggnewscale)

ggplot(dt) +
  geom_point(aes(depth, carat, colour = cut)) +
  scale_colour_brewer(palette = "Greens", name = "cut") +
  new_scale_color() +
  geom_point(aes(depth, carat, colour = clarity)) +
  scale_colour_brewer(palette = "Reds", name = "clarity")

enter image description here

对于中继器变体:

library(relayer)

ggplot(dt) +
  rename_geom_aes(geom_point(aes(depth, carat, cut = cut)), new_aes = c("colour" = "cut")) +
  rename_geom_aes(geom_point(aes(depth, carat, clarity = clarity)), new_aes = c("colour" = "clarity")) +
  scale_colour_brewer(palette = "Greens", aesthetics = "cut") +
  scale_colour_brewer(palette = "Reds", aesthetics = "clarity")
Warning: Ignoring unknown aesthetics: cut
Warning: Ignoring unknown aesthetics: clarity

enter image description here

希望这对您有帮助!

编辑:显然,在上面的绘图上,仅一种颜色显示在点上,因为您将同一x和y坐标叠加在彼此之上。我觉得我需要指出这一点。