【问题标题】:Extend geom_vline outside of plot将 geom_vline 扩展到绘图之外
【发布时间】:2020-03-27 07:11:36
【问题描述】:

我正在尝试将我的 ggplot 图中的 geom_vline 线扩展到绘图空间之外并进入轴区域。这样做的目的是让这些线分隔轴标签,以便它可以与旁边的另一个图对齐(见下文)。

一些简短的示例代码(我有更多行,因此需要水平线来保持直线):

library(ggplot2)
library(cowplot)
library(dplyr)

#play data set
cars.data <- mtcars %>%
      mutate(car_name = rownames(mtcars)) %>%
      slice(1:6)

#I would like vlines to be extend in this plot
p1 <- ggplot(cars.data, aes(x = car_name, y = hp)) +
    geom_point() +
    scale_x_discrete(position = "top") +
    coord_flip() +
    geom_vline(aes(xintercept = seq(1.5, 6.5, 1)), color = "gray60") +
    xlab("")


p2 <- ggplot(cars.data, aes(y = car_name, x = 1)) +
  geom_text(aes(label = disp)) +
  xlab("disp") +
  geom_hline(aes(yintercept = seq(1.5, 6.5, 1)), color = "gray60")+
  theme(axis.title.y = element_blank(),
        axis.title.x = element_text(vjust = 0.5, angle = 30),
        axis.text = element_blank(),
        axis.line = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "gray90"))

plot_grid(p1, p2, rel_widths = c(1,0.2))

结果如下图:

我正在寻找的是从p1 延伸线,以便它们在地块之间继续,几乎就像一个绘图表混合体。我试过clip = "off",但似乎没有奏效。

【问题讨论】:

    标签: r ggplot2 geom-vline


    【解决方案1】:

    当您设置clip = "off" 时,您必须自己绘制线条以确保它们可以延伸到绘图边界之外。我在这里使用geom_segment() 并在坐标中手动设置限制。

    您还需要对齐plot_grid() 中的两个图,以确保一切正常。

    library(ggplot2)
    library(cowplot)
    library(dplyr)
    
    #play data set
    cars.data <- mtcars %>%
      mutate(car_name = rownames(mtcars)) %>%
      slice(1:6)
    
    p1 <- ggplot(cars.data, aes(x = car_name, y = hp)) +
      geom_point() +
      scale_x_discrete(
        name = NULL,
        position = "top"
      ) +
      scale_y_continuous(expand = c(0, 0)) +
      coord_flip(clip = "off", ylim = c(80, 180)) +
      geom_segment(
        data = data.frame(x = seq(1.5, 6.5, 1), ymin = 80, ymax = 240),
        aes(x = x, xend = x, y = ymin, yend = ymax),
        inherit.aes = FALSE,
        color = "gray60"
      ) +
      xlab(NULL) +
      theme_cowplot()
    
    
    p2 <- ggplot(cars.data, aes(y = car_name, x = 1)) +
      geom_text(aes(label = disp)) +
      xlab("disp") +
      geom_hline(aes(yintercept = seq(1.5, 6.5, 1)), color = "gray60") +
      theme_cowplot() +
      theme(
        axis.title.y = element_blank(),
        axis.title.x = element_text(vjust = 0.5, angle = 30),
        axis.text = element_blank(),
        axis.line = element_blank(),
        axis.ticks = element_blank(),
        panel.background = element_rect(fill = "gray90"),
        plot.margin = margin(7, 7, 7, 0)
      )
    
    plot_grid(p1, p2, rel_widths = c(1,0.2), align = "h", axis = "bt")
    

    reprex package (v0.3.0) 于 2019 年 12 月 2 日创建

    【讨论】:

      【解决方案2】:

      这是一种入门方法,而不是依赖 ggplot 的轴标签来获得您想要的东西,而是将标签视为数据并构建您自己的。有一个问题,我们在这里使用了类似的方法:Bar charts connected by lines / How to connect two graphs arranged with grid.arrange in R / ggplot2

      一些技巧使这项工作:

      • 用左对齐的geom_text 替换轴标签并缩放以正确放置它
      • 使所有几何图形都使用相同的 x 轴变量,以便牛图可以沿该轴对齐
      • 在连接的边上设置负边距,这样面板就会从一个右到下一个,看起来像一个连续的图
      library(ggplot2)
      library(cowplot)
      library(dplyr)
      
      theme_set(theme_cowplot()) # I'm using cowplot v1.0.0 which no longer does this by default
      
      p_left <- ggplot(cars.data, aes(x = car_name, y = hp)) +
        geom_vline(aes(xintercept = seq(1.5, 6.5, 1)), color = "gray60") +
        geom_point() +
        scale_x_discrete(breaks = NULL) +
        coord_flip() +
        xlab(NULL) +
        theme(axis.text.y = element_blank(),
              axis.ticks.y = element_blank(),
              axis.line = element_blank(),
              plot.margin = margin(5, -5, 5, 5, "pt"),
              panel.border = element_blank())
      
      p_middle <- ggplot(cars.data, aes(x = car_name, y = 1)) +
        geom_vline(aes(xintercept = seq(1.5, 6.5, 1)), color = "gray60") +
        geom_text(aes(label = car_name), hjust = 0) +
        scale_x_discrete() +
        scale_y_continuous(expand = expansion(add = c(0.05, 0.5))) +
        coord_flip() +
        labs(x = NULL, y = "") +
        theme(axis.text = element_blank(),
              axis.ticks = element_blank(),
              axis.line = element_blank(),
              panel.grid = element_blank(),
              plot.margin = margin(5, -5, 5, -5, "pt"),
              panel.border = element_blank())
      
      p_right <- ggplot(cars.data, aes(x = car_name, y = 1)) +
        geom_vline(aes(xintercept = seq(1.5, 6.5, 1)), color = "gray60") +
        geom_text(aes(label = disp)) +
        scale_x_discrete() +
        coord_flip() +
        labs(x = NULL, y = "disp") +
        theme(axis.text = element_blank(),
              axis.ticks = element_blank(),
              axis.line = element_blank(),
              panel.grid = element_blank(),
              plot.margin = margin(5, 5, 5, -5, "pt"),
              panel.border = element_blank())
      
      
      plot_grid(p_left, p_middle, p_right,
        nrow = 1, rel_widths = c(1, 0.4, 0.2),
        align = "h"
      )
      

      我只复制了基本的主题更改——您可能需要调整内容以适应您的目的。我建议还深入研究每个单独的地块,逐个调整它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 1970-01-01
        • 2017-09-26
        • 1970-01-01
        • 2015-09-13
        相关资源
        最近更新 更多