帖子customize ggplot2 axis labels with different colors描述了当数据源中的每个(离散)值都有自己的相应标签时,如何更改每个标签的颜色。但是,当您拥有更大的数据集并且该数据集中的每个值都没有用其自己的值表示时(如何迅速使用连续值),如何有效地引用和格式化每个标签?
答案 0 :(得分:2)
以下内容适用于ggplot2 3.0.0。对于早期版本的ggplot2,ggplot_build(plt1)$layout$panel_params[[1]]$y.label
的确切结构会有所不同。
在下面的可重现数据集和相应的图表中,您将看到数据帧df中的A列和B列均具有10个观测值,并且在y轴上显示的B分配有4个标签。使用ggplot_build()
和theme()
,您可以按自己喜欢的方式引用和格式化y标签。下面,分别为负数和正数分配红色和蓝色。零仍然是黑色。
代码段
# settings
library(ggplot2)
set.seed(123)
# data
A = rnorm(10, mean=0, sd=1)
B = rnorm(10, mean=0, sd=1)
df <- data.frame(A,B)
# initial plot
plt1 <- ggplot(data = df) + aes(x=A, y=B)+geom_line()
# retrieve lables using ggplot_build()
yLabVals <- as.numeric(ggplot_build(plt1)$layout$panel_params[[1]]$y.labels)
# create color list
yLabs <- ifelse(yLabVals < 0, "red", "blue")
yLabs[yLabVals == 0] <- 'black'
# plot
plt2 <- plt1 + theme(axis.text.y = element_text(angle = 0, hjust = 1, colour = yLabs))
plt2
情节
答案 1 :(得分:1)
通过定义Y轴标签的间接解决方案:
breaks <- c(-2, -1, 0, 1)
labels <- breaks
cols <- ifelse(labels < 0, "red", ifelse(labels == 0, "black", "blue"))
plt <- ggplot(data = df) + aes(x=A, y=B)+geom_line() +
scale_y_continuous(breaks = breaks, labels = labels) +
theme(axis.text.y = element_text(angle = 0, hjust = 1, colour = cols))
plt
答案 2 :(得分:1)
对于ggplot2> = 3.3.0,比例现在使用proto。这是一个似乎可行的新技术。整个方法仍然非常脆弱,ggplot发出有关向element_text
提供向量的警告。值得寻找一个更强大的解决方案。
# settings
library(ggplot2)
set.seed(123)
# data
A = rnorm(10, mean=0, sd=1)
B = rnorm(10, mean=0, sd=1)
df <- data.frame(A,B)
# initial plot
plt1 <- ggplot(data = df) + aes(x=A, y=B)+geom_line()
# retrieve lables using ggplot_build()
yLabVals <- as.numeric(ggplot_build(plt1)$layout$panel_params[[1]]$y$get_labels())
# create color list
yLabs <- ifelse(yLabVals < 0, "red", "blue")
yLabs[yLabVals == 0] <- 'black'
# plot
plt2 <- plt1 + theme(axis.text.y = element_text(angle = 0, hjust = 1, colour = yLabs))
plt2