我正在制作一个 ggplot2 图表,其中我将非常广泛的数字映射到颜色。问题是我的数字是对数正态分布的,所以我有一堆数字都设置为相同的颜色,因为 ggplot2 中的渐变假设这些值处于非常相似的线性尺度上。以下是一些示例数据:
DF <- data.frame(A = 1:10,
B = 1:10,
C = 10^seq(-5, 4))
当我使用常规 ggplot2 设置时,除了最后一点之外的所有点都是深蓝色。
ggplot(DF, aes(x = A, y = B, color = C)) +
geom_point()
如果我对这些值进行对数变换,颜色看起来会更好,但现在我的图例显示对数变换值而不是实际值。
ggplot(DF, aes(x = A, y = B, color = log10(C))) +
geom_point()
我还尝试使用scale_color_gradientn,希望也许我可以按照我想要的方式设置数字中断,但这确实行不通。极小的值现在全部变成灰色或缺失。
ggplot(DF, aes(x = A, y = B, color = C)) +
geom_point() +
scale_color_gradientn(colors = grDevices::blues9,
values = 10^seq(-5, 4))
有没有办法让我的渐变颜色在 log10 范围内,但标签仍然是实际值?
你就快到了,你需要指定颜色范围:
library(ggplot2)
DF <- data.frame(A = 1:10, B = 1:10, C = 10^seq(-5, 4))
ggplot(DF, aes(x = A, y = B, color = C)) +
geom_point(size = 3) +
scale_color_gradient(trans = 'log10',
low = "lightblue", high = "darkblue",,
breaks = 10^seq(-5, 4),
labels = scales::comma) +
labs(color = "C Value") +
theme_minimal()
这给出了
如果你还是觉得浅蓝色太灰(浅蓝色中含有灰色,我建议你换成其他颜色:
library(ggplot2)
DF <- data.frame(A = 1:10, B = 1:10, C = 10^seq(-5, 4))
ggplot(DF, aes(x = A, y = B, color = C)) +
geom_point(size = 3) +
scale_color_gradient(trans = 'log10',
low = "blue", high = "red",
breaks = 10^seq(-5, 4),
labels = scales::comma) +
labs(color = "C Value") +
theme_minimal()