如何为分面geom_point滑块图设置独立X轴刻度并替换点为图片?
问题描述
我正在处理一个数据集,包含3个不同统计量的单个观测值,以及对应统计量总体的最小值、最大值和均值列。想用ggplot创建一维“滑块图”,把观测值点放在每个统计量的最小值与最大值之间。
尝试的代码:
library(tidyverse) df %>% ggplot(aes(x = value, y = 0)) + geom_point(size = 6, color = "black") + annotate("segment", x = df$min_value, xend = df$max_value, y = 0, yend = 0, size = 1) + geom_text(aes(label = "here")) + facet_wrap(~my_stat, ncol = 1, nrow = 3, scales = "free_x") + theme(axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.text.y = element_blank() )
生成的图表中每个统计量的图独立,但X轴刻度并未独立。需要修改代码让每个子图的X轴刻度对应各自统计量,确保数据正确绘制。另外,能否用图片替换图中的点?
数据集:
df <- structure(list(my_stat = c("a", "b", "c"), value = c(1.7, 2.1, 3), mean_value = c(2.5, 2, 4), min_value = c(1.5, 1.2, 2.9), max_value = c(3, 2.8, 6)), class = "data.frame", row.names = c(NA, -3L))
一、修复X轴刻度问题
问题出在annotate()函数——它不会跟随分面逻辑,会把所有统计量的线段都画到每个分面中,导致X轴被强制统一。改用geom_segment()即可解决,它会自动匹配每个分面对应的min_value和max_value:
修改后的代码:
library(tidyverse) df %>% ggplot(aes(y = 0)) + # 用geom_segment替代annotate,自动匹配分面数据 geom_segment(aes(x = min_value, xend = max_value, yend = 0), size = 1) + geom_point(aes(x = value), size = 6, color = "black") + geom_text(aes(x = value, label = "here")) + facet_wrap(~my_stat, ncol = 1, scales = "free_x") + theme( axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.text.y = element_blank(), axis.title.y = element_blank() # 隐藏冗余的Y轴标题 )
调整后每个分面的X轴会根据自身的数值范围自动生成刻度,数据也能正确对应。
二、用图片替换点
可以用ggimage包的geom_image()实现,只需替换掉geom_point()并指定图片路径即可,本地图片或在线图片都支持:
示例代码(以R官方logo为例):
library(tidyverse) library(ggimage) df %>% ggplot(aes(y = 0)) + geom_segment(aes(x = min_value, xend = max_value, yend = 0), size = 1) + # 用geom_image替换点,指定图片地址并调整大小 geom_image(aes(x = value), image = "https://www.r-project.org/logo/Rlogo.png", size = 0.1) + geom_text(aes(x = value, label = "here")) + facet_wrap(~my_stat, ncol = 1, scales = "free_x") + theme( axis.ticks.y = element_blank(), axis.line.y = element_blank(), axis.text.y = element_blank(), axis.title.y = element_blank() )
通过调整size参数可以控制图片显示的大小,适配分面布局。
内容的提问来源于stack exchange,提问作者887
相关产品推荐
相关产品推荐

