我正在尝试使用 ggplot 绘制一个图表来比较两个变量的绝对值,并显示它们之间的比率。由于比率是无单位的,而值不是无单位的,因此我无法在同一 y 轴上显示它们,因此我想将它们垂直堆叠为两个具有对齐 x 轴的独立图形。
这是我到目前为止所得到的:
library(ggplot2)
library(dplyr)
library(gridExtra)
# Prepare some sample data.
results <- data.frame(index=(1:20))
results$control <- 50 * results$index
results$value <- results$index * 50 + 2.5*results$index^2 - results$index^3 / 8
results$ratio <- results$value / results$control
# Plot absolute values
plot_values <- ggplot(results, aes(x=index)) +
geom_point(aes(y=value, color="value")) +
geom_point(aes(y=control, color="control"))
# Plot ratios between values
plot_ratios <- ggplot(results, aes(x=index, y=ratio)) +
geom_point()
# Arrange the two plots above each other
grid.arrange(plot_values, plot_ratios, ncol=1, nrow=2)
最大的问题是第一个图右侧的图例使其大小不同。一个小问题是,我不想在顶部绘图上显示 x 轴名称和刻度线,以避免混乱并明确它们共享同一轴。
我查看了这个问题及其答案:
对齐 ggplot 中的绘图区域
不幸的是,这两个答案都不适合我。分面似乎不太合适,因为我想为我的两个图表使用完全不同的 y 尺度。操作 ggplot_gtable 返回的维度似乎更有希望,但我不知道如何解决两个图具有不同数量的单元格的事实。天真地复制该代码似乎并没有改变我的案例的结果图形尺寸。
这是另一个类似的问题:
在 ggplot 中对齐绘图的危险
问题本身似乎提出了一个不错的选择,但 rbind.gtable 会抱怨表是否具有不同的列数,由于图例,这里就是这种情况。也许有办法在第二个表中插入额外的空列?或者有一种方法可以抑制第一个图中的图例,然后将其重新添加到组合图中?
这是一个不需要显式使用网格图形的解决方案。它使用方面,并隐藏“比率”的图例条目(使用来自https://stackoverflow.com/a/21802022).
library(reshape2)
results_long <- melt(results, id.vars="index")
results_long$facet <- ifelse(results_long$variable=="ratio", "ratio", "values")
results_long$facet <- factor(results_long$facet, levels=c("values", "ratio"))
ggplot(results_long, aes(x=index, y=value, colour=variable)) +
geom_point() +
facet_grid(facet ~ ., scales="free_y") +
scale_colour_manual(breaks=c("control","value"),
values=c("#1B9E77", "#D95F02", "#7570B3")) +
theme(legend.justification=c(0,1), legend.position=c(0,1)) +
guides(colour=guide_legend(title=NULL)) +
theme(axis.title.y = element_blank())
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)