在R中创建具有相同比例的ggplots

3
我想在R中执行以下操作:我有两个数据集(一个由4个值组成,另一个由3个值组成),我想使用ggplot2分别将它们绘制成条形图。但是,我想要同时使用相同的比例尺,即:如果数据集#1的最小值为0.2,数据集#2的0.4,则我希望两个数据集都使用0.2。对于最大值也适用(选择更大的值)。
因此,基本上,我想使这两个图表可比较。当然,最好应用相同的比例尺来着色条形图。现在,我正在使用colorRampPalette并将其应用于scale_fill_gradient2属性。
下面提供了一个MWE:
library("ggplot2")
val <- c(0.2, 0.35, 0.5, 0.65)
labels <- c('A', 'B', 'C', 'D')

LtoM <-colorRampPalette(c('green', 'yellow'))

df <- data.frame(val)
bar <- ggplot(data = df,
              aes(x = factor(labels),
                  y = val,
                  fill = val)) +
  geom_bar(stat = 'identity') + 
  scale_fill_gradient2(low=LtoM(100), mid='snow3', 
                       high=LtoM(100), space='Lab') +
  geom_text(aes(label = val), vjust = -1, fontface = "bold") +
  labs(title = "Title", y = "Value", x = "Methods") +
  theme(legend.position = "none")
print(bar)

给定上面的代码,以及另一个数据集,如 c(0.4, 0.8, 1.2) 和标签 c('E', 'F', 'G'),如何调整代码以创建两个不同且分离的图形(最终保存为PNG),但使用相同的 (0.2到1.2) 刻度来表示柱子的高度和颜色(因此将图像放在一起,表明具有相同高度但属于不同图像的柱子以相同方式出现,并且它们的颜色相同)?

你可以尝试像这样使用 min(min(dataset1), min(dataset2)) 作为你的第一个 ylim() 参数。 - cimentadaj
非常感谢,我尝试了一下,几乎和下面的答案一样(除了调整)。 - mindthegap
你可以在scale_fill_gradient2中设置limits,以保持绘图之间的填充比例尺相同。 - aosmith
2个回答

3
我们可以使用scale_y_continuous中的breaks参数来确保具有一致的轴刻度,然后使用coord_cartesian来确保强制两个图表具有相同的y轴范围。
df1 <- data.frame(val = c(0.2, 0.35, 0.5, 0.65), labels = c('A', 'B', 'C', 'D'))
df2 <- data.frame(val = c(0.4, 0.8, 1.2), labels = c('E', 'F', 'G'))

g_plot <- function(df) {
    ggplot(data = df,
          aes(x = factor(labels),
              y = val,
              fill = val)) +
        geom_bar(stat = 'identity') + 
        scale_fill_gradient2(low=LtoM(100), mid='snow3', 
                     high=LtoM(100), space='Lab') +
        geom_text(aes(label = val), vjust = -1, fontface = "bold") +
        scale_y_continuous(breaks = seq(0, 1.2, 0.2)) + 
        coord_cartesian(ylim = c(0, 1.2)) + 
        labs(title = "Title", y = "Value", x = "Methods") +
        theme(legend.position = "none")
}

bar1 <- g_plot(df1);
bar2 <- g_plot(df2);
gridExtra::grid.arrange(bar1, bar2, ncol = 2);

Example


非常出色的回答,非常感谢。:) 唯一尚未解决的问题是着色。对于常见的颜色比例(0.65和1.2肯定有相同的黄色,但字母至少应该是橙色或红色),有什么想法吗? - mindthegap
自己成功解决了绘图颜色问题(通过为scale_fill_gradient2属性提供不同的着色参数来实现)。感谢您的时间。 - mindthegap

1

其实你不需要使用coord_cartesian。你可以直接使用scale_y_continuous中的limits参数,就像这样:

scale_y_continuous(limits = c(0,1.2), breaks = seq(0, 1.2, 0.2))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接