【问题标题】:Minor grid lines in ggplot2 with discrete values and facet gridggplot2中具有离散值和分面网格的次要网格线
【发布时间】:2017-07-04 10:41:24
【问题描述】:

我有一个使用 ggplot2 创建的图,我正在尝试修改一些次要网格线。这是当前版本:

library(tidyverse)

data(starwars)
starwars = starwars %>% 
  filter(!is.na(homeworld), !is.na(skin_color)) %>%
  mutate(tatooine = factor(if_else(homeworld == "Tatooine", "Tatooine Native", "Other Native")),
         skin_color = factor(skin_color))

ggplot(starwars, aes(birth_year, skin_color)) +
  geom_point(aes(color = gender), size = 4, alpha = 0.7, show.legend = FALSE) +
  facet_grid(tatooine ~ ., scales = "free_y", space = "free_y", switch = "y") +
  theme_minimal() + 
  theme(
    panel.grid.major.x = element_blank(),
    panel.grid.major.y = element_blank(),
    axis.title.x = element_blank(),
    axis.title.y = element_blank(),
    strip.placement = "outside",
    strip.background = element_rect(fill="gray90", color = "white"),
  ) + 
  geom_hline(yintercept = seq(0, length(unique(starwars$skin_color))) + .5, color="gray30")

Y轴是一个因素,使用了一个分面网格,每个网格中的类别数量是奇数。我使用 geom_hline 添加了一些次要网格线(我的理解是 panel.grid.minor 不适用于分类数据,即因子)。

我想删除下面以黄色突出显示的线条,然后在两个分面网格之间添加一条黑线(即当前以黄色突出显示的双线所在的位置)。

有什么办法吗?我宁愿避免对任何行的位置进行硬编码,以防数据发生变化。谢谢。

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    动态删除顶部和底部网格线相对容易。您根据分面组对数据集中的行位置进行编码并排除最高和最低值,并在 aes() 语句内绘制带有 xinterceptgeom_hline。这种方法对更改数据很有效(要查看这种方法在您更改数据时是否有效,请注释掉下面的# filter(!is.na(birth_year)) 行)。

    library(tidyverse)
    library(grid)
    
    data(starwars)
    starwars = starwars %>% 
      filter(!is.na(homeworld), !is.na(skin_color)) %>%
      mutate(tatooine = factor(if_else(homeworld == "Tatooine", "Tatooine Native", "Other Native")),
             skin_color = factor(skin_color)) %>% 
      # filter(!is.na(birth_year)) %>% 
      group_by(tatooine) %>% 
    
      # here we assign the line_positions
      mutate(line_positions = as.numeric(factor(skin_color, levels = unique(skin_color))), 
             line_positions = line_positions + .5,  
             line_positions = ifelse(line_positions == max(line_positions), NA, line_positions)) 
    
    
    plot_out <- ggplot(starwars, aes(birth_year, skin_color)) +
      geom_point(aes(color = gender), size = 4, alpha = 0.7, show.legend = FALSE) +
      geom_hline(aes(yintercept = line_positions)) + 
      facet_grid(tatooine ~ ., scales = "free_y", space = "free_y", switch = "y") +
      theme_minimal() + 
      theme(
        panel.grid.major.x = element_blank(),
        panel.grid.major.y = element_blank(),
        panel.grid.minor.y = element_line(colour = "black"),
        axis.title.x = element_blank(),
        axis.title.y = element_blank(),
        strip.placement = "outside",
        strip.background = element_rect(fill="gray90", color = "white"), 
    
      ) 
    
    print(plot_out)
    

    给予

    但是,在没有任何硬编码的情况下在构面之间添加实体是很困难的。有一些可能的方法可以在构面之间添加边框(请参阅here),但是如果我们不知道构面是否发生变化,那么应该为哪个值分配边框并不明显。我想有一个可能的解决方案是在图中绘制一条硬编码线来划分各个方面,但棘手的部分是根据数据以及最终如何绘制方面来动态确定边界的位置(例如按哪个顺序等)。我很想听听对此的其他意见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-22
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 2014-07-08
      相关资源
      最近更新 更多