【问题标题】:Figure output with same scale size between plots, but different axis length [duplicate]图输出在图之间具有相同的比例大小,但轴长度不同[重复]
【发布时间】:2014-05-29 03:27:52
【问题描述】:

我正在使用ggplot2 创建两个不同的 x,y 图。我希望 y 轴的比例相同(例如,在两个图中,0 和 10 之间的距离相同)但每个图/图的长度不同(如果一个图变为 20,另一个到 50,到 50 的那个应该更大)。

facet_Grid 不是一个好选择,因为我有一百多个不同的情节要制作。

示例数据:

dat1 <- data.frame(replicate(2,sample(0:20,10,rep=TRUE)))
dat2 <- data.frame(replicate(2,sample(0:60,10,rep=TRUE))

绘图 1:y 列数据范围从 0 到 20。x 比例为 0 到 100
图 2:y 列数据范围从 0 到 60。x 比例为 0 到 100

标准图:

ggplot(data = dat1, aes (x=X1, y= X2)) + xlim(0,100)
ggplot(data = dat2, aes (x=X1, y= X2)) + xlim(0,100)

我得到两个大小相同的图,但它们在 y 轴上的比例不同。

如果我对 y 设置限制以强制它们相同:

ggplot(data = dat1, aes (x=X1, y= X2)) + xlim(0,100) + ylim(0,60)
ggplot(data = dat2, aes (x=X1, y= X2)) + xlim(0,100) + ylim(0,60)

第一个情节在 20 到 60 之间有大量我不想要的浪费空间。

关于如何在输出图像中保持一致的比例大小,同时具有不同的轴限制(因此在这种情况下不同的绘图高度)有什么想法吗?我需要它们在打印页面上具有相同的比例,但高度不同。

有什么想法吗?玩scale_y_continuouscoord_equal 等并没有真正让我到任何地方。

我正在尝试制作的示例 photoshopped 模型,但作为单独的输出文件。在每个图中,y 轴上的 1cm 在多个图之间是相同的:

【问题讨论】:

  • 请阅读有关how to ask a question 的信息以及如何生成minimal reproducible example。还分享您迄今为止尝试过的任何代码。这将使其他人更容易帮助您。
  • 更新了代码,试图更好地解释这一点。我需要在图表上使用相同的比例,但需要不同大小的数字。
  • @rockandrcrush 如果您已经解决或指定了您的问题,则应该关闭/接受/删除。

标签: r ggplot2


【解决方案1】:

也许正在寻找类似的东西?

一些数据

df1 <- data.frame(x= rep(1:10,10), y = 1:100)

合并并添加引用 col df

newdf <- rbind(data.frame(df1[1:60,],df="df1"),data.frame(df1[1:20,],df="df2"))

dplyr添加一个新的分组最大y值列

require(dplyr)
newdf <- newdf %>% group_by(df) %>% mutate(ymax = max(y)) 

现在我们用geom_rect() 绘制线数据和缩放边界

ggplot(newdf) + 
    geom_rect(fill=NA,colour="grey",aes(xmin=0,xmax=max(x),ymin=0,ymax=ymax)) + 
    facet_grid(. ~ df, margins = FALSE) + geom_line(aes(x,y))

最后,用一个主题来摆脱一些元素……

一个名为thmEls的非常有限的主题对象示例。

require(grid)
require(ggplot2)

thmEls <- 
    theme(
        # PARENT ----------------------------------------------
        # line = element_blank(),
        rect = element_rect(fill="white",colour="gray40", size=0.35, linetype=1),
        # text = element_blank(),
        # title = NULL,
        # axis.title = NULL,

        # AXIS -------------------------------------------------
        # axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        # axis.text = element_blank(),
        # axis.text.x = element_blank(),
        axis.text.y = element_blank(),
        # axis.ticks = element_blank(),
        # axis.ticks.x = element_blank(),
        axis.ticks.y = element_blank(),
        # axis.ticks.length = element_blank(),
        # axis.ticks.margin = element_blank(),
        # axis.line = element_blank(),
        # axis.line.x = element_blank(),
        # axis.line.y = element_blank(),

        # LEGEND ----------------------------------------------
        # legend.background = element_blank(),
        # legend.key = element_blank(),
        # legend.key.size = element_blank(),
        # legend.key.width = element_blank(),
        # legend.text = element_blank(),
        # legend.text.align = element_blank(),
        # legend.position = element_blank(),
        # legend.direction = element_blank(),
        # legend.justification = element_blank(),
        # legend.box = element_blank(),
        # legend.box.justification = element_blank(),

        # PANEL ------------------------------------------------
        # ,size=0.3 from panel.background
        panel.background = element_blank(),
        # panel.border = element_blank(),
        panel.margin = unit(c(0.125),"lines"),
        # panel.grid = element_blank(),
        # panel.grid.major = element_blank(),
        # panel.grid.minor = element_blank(),
        # panel.grid.major.x = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.x = element_blank(),
        panel.grid.minor.y = element_blank(),

        # PLOT ------------------------------------------------
        plot.background = element_blank(),
        plot.title = element_blank(),
        plot.margin = unit(c(0.3,0.3,0.15,0.15),"lines"),

        # STRIP -----------------------------------------------
        strip.background = element_blank(),
        strip.text = element_blank(),
        # strip.text.x = element_blank(),
        # strip.text.y = element_blank(),
        complete = FALSE)

将此添加到我们的情节中:

 ggplot(newdf) + 
    geom_rect(fill=NA,colour="grey",aes(xmin=0,xmax=max(x),ymin=0,ymax=ymax)) + 
    facet_grid(. ~ df, margins = FALSE) + geom_line(aes(x,y)) + 
    thmEls

给予:

【讨论】:

  • 由于地块的数量,试图远离 facet_grid。该示例显示 2 个图。实际上,我有大约 150 个我需要的相同规模。在上面的示例中,我希望 df2 从 20-60 中删除所有空白(例如,比例相同,但图像高度会短得多)。
  • @rockandrcrush 供将来参考,让您的帖子提供有关解决方案可能需要遵守的任何限制的信息。见:stackoverflow.com/questions/5963269/…
  • 尽快更新帖子。
猜你喜欢
  • 2021-12-07
  • 1970-01-01
  • 1970-01-01
  • 2016-05-05
  • 1970-01-01
  • 2013-01-22
  • 2018-12-05
  • 2021-11-26
  • 2015-11-26
相关资源
最近更新 更多