【问题标题】:create two separate ggplots with comparable y axis but with different y limits创建两个具有可比 y 轴但具有不同 y 限制的单独 ggplots
【发布时间】:2017-12-17 16:51:41
【问题描述】:

我正在尝试按照以下示例在地图上绘制条形图:How to plot barchart onto ggplot2 map。这工作正常,但与我想添加 x 和 y 轴的示例相反。问题是数据的 y 范围在我要为其创建条形图的区域之间存在很大差异。

为了生成可比较的图表(即 y 轴具有相同的维度),我将相同的 y 限制应用于所有图表并调整每个图表的中断。然而,这不是一个好的解决方案,因为一些图表(在本例中为 p2)在条形图的上方和下方有很大的空白区域。为了使它工作,我正在寻找一种方法来裁剪图形以删除空白区域,同时保持图形的尺寸以便可以比较 y 轴。

library(dplyr)
library(ggplot2)

df <- data.frame(type = c("A", "B", "A", "B"), country = c("NLD", "NLD", "BEL", "BEL"), value = c(10, -10, 5, 2))

df1 <- filter(df, country == "NLD") 
p1 <- ggplot(data = df1) +
    geom_col(aes(x = type, y = value)) +
    scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df1$value), max(df1$value), 2)) + 
    theme_bw()
p1


df2 <- filter(df, country == "BEL") 
p2 <- ggplot(data = df2) +
      geom_col(aes(x = type, y = value)) +
      scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks   = seq(min(df2$value), max(df2$value), 2)) +
      theme_bw()
    p2

【问题讨论】:

    标签: r ggplot2 comparable yaxis


    【解决方案1】:

    您是否为每个情节尝试过coord_fixed?如果您可以将每个图的宽度控制相同,则条形的高度将具有可比性。

    library(dplyr)
    library(ggplot2)
    library(gridExtra)
    
    df <- data.frame(type = c("A", "B", "A", "B"), country = c("NLD", "NLD", "BEL", "BEL"), value = c(10, -10, 5, 2))
    
    df1 <- filter(df, country == "NLD") 
    p1 <- ggplot(data = df1) +
      geom_col(aes(x = type, y = value)) +
      # scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks = seq(min(df1$value), max(df1$value), 2)) + 
      theme_bw()
    
    df2 <- filter(df, country == "BEL") 
    p2 <- ggplot(data = df2) +
      geom_col(aes(x = type, y = value)) +
      # scale_y_continuous(limits = c(min(df$value), max(df$value)), breaks   = seq(min(df2$value), max(df2$value), 2)) +
      theme_bw()
    
    x_range <- length(unique(df$type))
    y_range1 <- max(df1$value) - min(df1$value)
    y_range2 <- max(df2$value) - min(df2$value)
    
    g1 <- p1 + coord_fixed(ratio = x_range / y_range1)
    g2 <- p2 + coord_fixed(ratio = x_range / y_range1)
    
    # example output
    grid.arrange(g1, g2, nrow = 1)
    

    【讨论】:

    • 这是一个非常简单的解决方案,可以解决我 90% 的问题。但是,对于某些单独的图,我没有 x 轴上所有类别的数据,因此,此解决方案会导致这些图的大小失真。我欢迎提供通用解决方案的解决方案。
    • 不确定这是否是您想要的,但您可以将 scale_x_discrete(limits = levels(df$type)) 添加到 p1、p2、...,以强制所有地块具有相同的 x-axis,这样每个条形宽度将是p1, p2, .... 相同。如果缺少类型,则会有一个空格。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多