ggplot2的作者hadley一直不建议使用双坐标轴,他认为双轴系统有很大缺陷,做出的图片往往具有迷惑性。但是最后架不住需要的人太多,而且由于语言太高级,能自己手动搞的人很少,作者最终还是给出了相应的解决方案。
目前来看,第二条坐标轴往往需要和第一个坐标轴有映射关系,反正我暂时不会做那种任意值分割的第二条轴。
测试数据
由于iris的几列数据的mean太过相近,在iris后面加一列 - add 生成我们的测试数据。
iris$add <- runif(150, min = 0, max = 1)
数据处理
col_data <- iris %>%
group_by( Species)%>%
summarise(mean = mean(Sepal.Length))
# 得到的均值为5左,该值将用于做柱状图
# add 是一列均值为 0.5 左右的数据,如果和上面的柱状图放一起,
# 几乎看不到三个分组间的差异,扩大10倍后,可以显示细微差异。
line_data <- iris %>%
group_by(Species) %>%
summarise(mean_line = mean(add)*10)
双坐标轴图
col_plot <- ggplot() +
geom_col(data = col_data, aes(x = Species,
y = mean, fill = Species), width = 0.5)
p <- col_plot +
geom_point(data = line_data, aes(x = Species, y = mean_line)) +
geom_line(data = line_data, aes(x = Species, y = mean_line),
group = 1)
#添加第二条y坐标轴,(~ ./10)表示将数据处理过程中,
# 对折线图mean值增加的10倍进行抵消,第二y轴标签显示为真实值
p + scale_y_continuous(sec.axis = sec_axis(~ ./10, name = "add"))
调整第二条y坐标轴titel方向
p +
scale_y_continuous(sec.axis = sec_axis(~ ./10, name = "add")) +
theme(axis.title.y.right = element_text(angle = 90,
hjust =0.5))