此代码显然不起作用(两个分类变量使用相同的图例和配色方案。
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"))
绘制此图形的正确方法是什么?
答案 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")
技巧是使用具有填充的形状并使用该填充来映射变量。不利的一面是,这个技巧不能扩展到任何数量的变量。有一些可以实现您想要的功能的软件包,即ggnewscale或relayer。
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")
对于中继器变体:
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
希望这对您有帮助!
编辑:显然,在上面的绘图上,仅一种颜色显示在点上,因为您将同一x和y坐标叠加在彼此之上。我觉得我需要指出这一点。