如何在ggplot绘图中同时使用coord_trans与coord_flip
问题原因
ggplot2不支持同时调用多个坐标系函数,后调用的坐标系配置会直接覆盖之前的设置,你代码里最后添加的coord_trans(y = "log10")覆盖了之前的coord_flip(),所以翻转效果不生效。
解决方案
你需要的是统计计算完成后再做对数变换+坐标轴翻转,所以完全可以把两个需求合并到同一个坐标系配置里,不需要分开调用两个coord函数,这里给两种兼容不同版本的写法:
写法1:适用于ggplot2 3.3.0及以上版本
不需要修改原有aes映射,直接在coord_trans中通过flip = TRUE参数实现翻转,删除原有单独的coord_flip()行即可,修改后完整代码如下:
p <- ggplot(df.2,aes(reorder(x,y),y,colour=z)) + geom_jitter(width = 0.2,size=0.1) + theme_classic(base_size = 8) + stat_summary( fun = mean, geom = "errorbar", aes(ymax = ..y.., ymin = ..y..), position = position_dodge(width = 0.1), width = 0.7, colour="black") + theme(legend.position = "none") + labs(x="",y="") + scale_color_manual(values = mycolors) # 合并翻转和对数变换到同一个coord_trans p + coord_trans(y = "log10", flip = TRUE)
写法2:全版本兼容写法
直接交换aes中的x、y映射,去掉单独的coord_flip(),给现在映射为x轴的数值列做对数变换即可,逻辑更直观不易出错:
p <- ggplot(df.2,aes(x = y, y = reorder(x,y), colour=z)) + geom_jitter(height = 0.2,size=0.1) + # 交换x/y后jitter的方向参数从width改成height theme_classic(base_size = 8) + stat_summary( fun = mean, geom = "errorbar", aes(xmax = ..x.., xmin = ..x..), # 交换x/y后对应参数也从ymax/ymin改成xmax/xmin position = position_dodge(width = 0.1), width = 0.7, colour="black") + theme(legend.position = "none") + labs(x="",y="") + scale_color_manual(values = mycolors) # 直接给数值轴(现在是x轴)做对数变换 p + coord_trans(x = "log10")
两种写法都不会影响stat_summary的计算结果,因为coord_trans的坐标变换是在所有统计计算完成后才执行的,完全避免了scale_y_log10先做变换再算统计量的问题。
内容的提问来源于stack exchange,提问作者user2300940
相关产品推荐
相关产品推荐

