ggplot2 连续颜色图例如何显示包含 0 的自定义刻度?
数据小许
解决方法:同时设置 limits 和 breaks
在 scale_colour_distiller() 中加入 limits = c(0, NA),将颜色标度的下限设为 0,上限仍由数据决定。保留原来的 breaks,图例就会显示 0、1 和 2。
library(ggplot2)
ggplot(
data = iris,
mapping = aes(
x = Sepal.Length,
y = Petal.Length,
colour = Petal.Width
)
) +
geom_point() +
scale_colour_distiller(
palette = "Spectral",
limits = c(0, NA),
breaks = c(0, 1.0, 2.0)
)
为什么 breaks 中的 0 没有显示?
breaks 指定刻度位置,不会扩大颜色标度的范围。默认情况下,连续颜色标度的上下限由映射变量的数据范围决定。
在 iris 数据集中,Petal.Width 的最小值大于 0,所以 0 落在默认颜色范围之外,图例中不会显示这个刻度。可以用下面的代码查看数据范围:
range(iris$Petal.Width, na.rm = TRUE)
设置 limits = c(0, NA) 后,颜色标度范围包含了 0,breaks 中的这个刻度就会显示。其中,NA 表示上限由数据自动确定。
如果需要显示为 0、1.0 和 2.0
在 R 中,1.0 和 1 是相同的数值,因此在 breaks 中写 1.0 并不能保证图例保留小数位。如果需要固定显示形式,可以另外指定 labels:
scale_colour_distiller(
palette = "Spectral",
limits = c(0, NA),
breaks = c(0, 1.0, 2.0),
labels = c("0", "1.0", "2.0")
)
labels 要与 breaks 的数量和顺序对应。
调整范围时要注意什么?
改变 limits 会改变数值与颜色的映射,散点颜色可能与原图略有不同。
不建议为了显示这三个刻度而直接设置 limits = c(0, 2),因为示例数据中有大于 2 的值。连续颜色标度默认会把范围外的值按缺失值颜色处理。使用 limits = c(0, NA) 可以扩展下限,同时保留由数据确定的上限。
备注:内容仅供参考。
