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

时间:2017-01-20 16:31:51

标签: r ggplot2 scale bar-chart

我想在R中执行以下操作:我有2个数据集(一个包含4个,另外3个值),我想用ggplot2作为条形图(单独)绘制它们。但是,我想对两者使用相同的比例,即:如果数据集#1的最小值是数据集#2的0.2和0.4,那么我想对两者使用0.2。同样适用于最大值(选择更大值)。

所以,基本上,我想让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)的{​​{1}}数据集,如何调整代码以创建2个不同且分离的图(最后保存到PNG中,即),但使用公共( c('E', 'F', 'G'))对条形高度及其颜色进行缩放(因此将图像精确地移动到彼此旁边表示具有相同高度但属于不同图像的条形以相同方式出现并且它们的颜色相同)?

2 个答案:

答案 0 :(得分:0)

我们可以在breaks中使用scale_y_continuous参数的混合来确保我们具有一致的轴刻度,然后使用coord_cartesian来确保我们强制两个绘图具有相同的y -axis range。

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

答案 1 :(得分:0)

您实际上不需要使用coord_cartesian。您可以仅在scale_y_continuous中使用limits参数,如下所示:

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