在这里找到我的问题的部分解决方案。我将展示该解决方案的工作原理以及仍然缺少哪些功能来满足我的需求。为了保持一致,我使用了一个示例数据集,该数据集与另一个线程的数据集相似:
library(ggplot2)
library(reshape2)
library(tidyverse)
df <- data.frame(x = c(1:5), a = c(1,2,3,3,3), b = c(1,1.1,1.3,1.5,1.5))
df <- mutate(df, log2 = log2(x))
df <- df <- melt(df, c("x", "log2"))
Run Code Online (Sandbox Code Playgroud)
数据的初始图(由以下代码创建)在单独的图例中具有shape和color外观,这是不希望的:
ggplot(df) +
geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
geom_line(aes(x, log2, color = "log2(x)"), size = 1.5)
Run Code Online (Sandbox Code Playgroud)
该解决方案建议使用guides()并将override.aes它们组合成单个图例,这肯定是对原始图的改进:
ggplot(df) +
geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) +
guides(shape = FALSE,
colour = guide_legend(override.aes = list(shape = c(16, 17, NA),
linetype = c("blank", "blank", "solid"))))
Run Code Online (Sandbox Code Playgroud)
我的问题是,我想手动控制color在兼具美感geom_point和geom_line。例如,我要使三角形变成浅灰色,使圆变成深灰色,而log2(x)线变成浅蓝色。我对guides()工作方式的了解非常有限,因此,我能做到的最好的事情如下:
ggplot(df) +
geom_point(aes(x, value, shape = variable), color = "gray40", size = 3, data = filter(df, variable == "a")) +
geom_point(aes(x, value, shape = variable), color = "gray70", size = 3, data = filter(df, variable == "b")) +
geom_line(aes(x, log2, shape = "log2(x)"), color = "cadetblue2", size = 1.5) +
guides(shape = guide_legend(override.aes = list(color = c("gray40", "gray70", "cadetblue2"),
shape = c(16, 17, NA),
linetype = c("blank", "blank", "solid"))))
Run Code Online (Sandbox Code Playgroud)
这似乎是对shape美学的不当使用geom_line(给出警告),但这几乎是我想要的结果。现在的问题log2(x)是缺少图例图标。理想情况下,它应显示与图相匹配的水平浅蓝色线。有谁知道如何实现这一目标和/或可以更好地解释该guides()功能的预期用途?
我一直在使用的组合也尝试过解决方案scale_color_manual(),scale_linetype_manual()和scale_shape_manual()(都具有相同的name说法,这样他们应该在一个单一的传奇结束了)。这种方法的问题在于,所有3个几何层都具有color美感,但是只有前两个具有shape美感,只有最后一个具有linetype美感。因此,即使scale_xx_manual()要ggplot正确设置所有添加项,图例也不会合并为一个。
我已经坚持了很长时间,因此,我们将不胜感激。谢谢
只需创建一个手动的色标,它将改变绘图和指南中的颜色。通常,您总是希望使用标尺而不是覆盖指导值,因为它消除了在指导中犯错误的风险,该错误可能导致您的可视化内容蒙上阴影。
ggplot(df) +
geom_point(aes(x, value, colour = variable, shape = variable), size = 3) +
geom_line(aes(x, log2, color = "log2(x)"), size = 1.5) +
scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) +
guides(shape = FALSE,
colour = guide_legend(override.aes = list(shape = c(16, 17, NA),
linetype = c("blank", "blank", "solid"))))
Run Code Online (Sandbox Code Playgroud)
编辑:
这是一个避免对形状进行覆盖的版本:
ggplot(df) +
geom_point(aes(x, value, colour = variable, shape = variable, linetype = variable), size = 3) +
geom_line(aes(x, log2, color = "log2(x)", linetype = "log2(x)", shape = "log2(x)"), size = 1.5) +
scale_color_manual(values = c("a" = "gray40", "b" = "gray70", "log2(x)" = "cadetblue2")) +
scale_shape_manual(values = c("a" = 16, "b" = 17, "log2(x)" = NA)) +
scale_linetype_manual(values = c("a" = "blank", "b" = "blank", "log2(x)" = "solid"))
Run Code Online (Sandbox Code Playgroud)
ggplot会自动结合传说当名称,标签和方向是相同的(1,2),所以你只需要确保“A”,“B”,和“的log 2(X)”都映射到每个审美的相同的顺序。在这种情况下,我们通过向图层添加不必要的映射并忽略警告来实现此目的。
| 归档时间: |
|
| 查看次数: |
5994 次 |
| 最近记录: |