【问题标题】:Tick marks misaligned with panel in ggplot2 [R]刻度线与ggplot2 [R]中的面板未对齐
【发布时间】:2017-12-04 16:44:59
【问题描述】:

在刻度线的结束位置和面板的开始位置之间似乎总是存在一些小但明显的偏移。

当指定轴限制以使轴以刻度结束时,这一点更加明显(见上文)。 例如,在y轴上,最高刻度太高,最低刻度太低。

要重现的代码:

library(ggplot2) p <- ggplot(mtcars,aes(mpg, wt)) + geom_point() + scale_y_continuous(limits=c(1,5),expand=c(0,0)) p <- p + theme_few() p <- p + theme(axis.ticks=element_line(size=0.5),axis.ticks.length = unit(0.5, "cm")) # enlarged for clarity, although this happens regardless 我该如何解决这个问题?

编辑:

在对我自己的数据使用接受的答案时,我注意到这也改变了轴极值点的剪裁方式。有没有办法正确对齐刻度和面板,但不改变这种行为?我不想删除这些点,只是仍然隐藏面板外的部分。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    不是位置关闭,而是面板边框被剪裁,

    library(ggplot2)
    p <- ggplot(mtcars,aes(mpg, wt)) + geom_point() + scale_y_continuous(limits=c(1,5),expand=c(0,0))
    p <- p + theme_bw()
    p <- p + theme(axis.ticks=element_line(size=3),
                   panel.border = element_rect(size = 3),
                   axis.ticks.length = unit(0.5, "cm"))
    
    g <- ggplotGrob(p)
    
    g$layout$clip <- "off"
    library(gridExtra)
    grid.arrange(p, g, ncol=2)
    

    编辑:上述观察并不是一个解决方案;如 cmets 所述,关闭整个面板的剪裁对于从面板区域泄漏的点来说是有问题的。一种可能的解决方法是向 gtable 添加一个新的 grob,例如通过从面板中提取它并将其添加到顶部而不剪辑。

    library(ggplot2)
    p <- ggplot(mtcars,aes(mpg, wt)) + geom_point(size=20) + scale_y_continuous(limits=c(1,5),expand=c(0,0))
    p <- p + theme_bw()
    p <- p + theme(axis.ticks=element_line(size=2),
                   panel.border = element_rect(size = 2),
                   axis.ticks.length = unit(0.5, "cm"))
    
    g <- ggplotGrob(p)
    panel_id <- g$layout$name == "panel"
    border <- tail(g$grobs[panel_id][[1]][["children"]], 1)
    g <- gtable::gtable_add_grob(g, border, 
                                 t = min(g$layout$t[panel_id]),
                                 l = min(g$layout$l[panel_id]),
                                 name = "border",
                                 clip = "off")
    
    library(gridExtra)
    grid.arrange(p, g, ncol=2)
    

    【讨论】:

    • 有什么办法可以保留这个面板的宽度,但仍然在极限处裁剪数据点? (不完全删除它们,只是将部分隐藏在外面。)[编辑原始帖子以嵌入示例图像]
    • 我并不是真的建议删除剪辑;正如您发现的那样,它会产生令人不快的副作用。 IMO 正确的解决方案是将面板边框绘制在面板顶部(因此不会被剪裁),但我很确定这已经被报告过好几次了。
    • 我无法找到在 gridExtra 内部或外部手动订购 ggplot2 元素的方法。你能参考一个例子吗?否则,我能想到的唯一(公认的 hacky)方法是在原始图的顶部覆盖一个空白的未剪辑面板。
    • 我只想告诉你,关闭面板剪裁更简单的方法是使用+ coord_cartesian(clip = "off")
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-11
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    相关资源
    最近更新 更多