代码之家  ›  专栏  ›  技术社区  ›  Mankka

如何在Ggplot2中绘制均匀的径向图

  •  4
  • Mankka  · 技术社区  · 4 月前

    我在用 coord_radial ggplot2,但我无法使轴限制正确。x美学(在这种情况下为θ)是一个因子,y(r)是个数。我希望第一个因子水平正好位于12(北),其他水平均匀分布。在下面的示例中,第一个和最后一个级别(A和D)之间的间隙大于其他间隙。除此之外,我还尝试使用 scale_x_discrete expand 。下面是一个最小的例子,但我的真实案例有15个级别。

    library(dplyr)
    library(ggplot2)
    
    tibble(lab = c("A", "B", "C", "D"),
           val = rexp(4)) %>%
      ggplot(aes(lab, val, group = 1)) +
      geom_line() +
      coord_radial(r.axis.inside = TRUE)
    

    Radial plot that is not evenly in four pieces.

    3 回复  |  直到 4 月前
        1
  •  2
  •   zx8754    4 月前

    将expand last值设置为1,这意味着在最后一个值“D”后添加1个空格。

    library(ggplot2)
    
    ggplot(data.frame(lab = c("A", "B", "C", "D"),
                      val = rexp(4)),
           aes(lab, val, group = 1)) +
      geom_line() +
      scale_x_discrete(expand = c(0, 0, 0, 1)) +
      coord_radial()
    

    enter image description here

    测试 :尝试在不使用的情况下运行代码 coord_radial 看看扩张的效果。

    enter image description here

        2
  •  2
  •   Edward    4 月前

    如果你想在第一级和最后一级之间留出差距,那么你可以添加 scale_x_discrete(expand = expansion(mult = xxx))) 以调整数据和轴之间的间隙。默认情况下,连续变量的刻度每侧扩展5%,离散变量的刻度每条扩展0.6个单位(请参阅帮助页面 scale_x_discrete ).

    我不清楚要扩展多少(这在很大程度上取决于你有多少离散的类别),但通过一点尝试和错误,你可能会找到最好看的图。

    set.seed(10)
    n <- 15
    tibble(lab = LETTERS[1:n], val = rexp(n)) %>%
      ggplot(aes(lab, val, group = 1)) +
      geom_line() +
      coord_radial(r.axis.inside = TRUE) +
      scale_x_discrete(expand = expansion(mult = c(0, 0.08))
    

    enter image description here

        3
  •  1
  •   Zé Loff    4 月前

    水平之间的不同差距是由以下原因造成的 expand 违约 TRUE ,on coord_radial() 因此,通过设置 expand = FALSE ,你会得到相等的差距:

    tibble(lab = LETTERS[1:4],
           val = rexp(4)) %>%
    ggplot(aes(lab, val, group = 1)) +
    geom_line() +
    coord_radial(r.axis.inside = TRUE,
                 expand = FALSE)
    

    First plot

    现在的问题是,第一层和最后一层在同一个地方。我对此不太优雅的解决方案是添加一个额外的 lab 在数据上,与 NA 作为一个值,然后设置 breaks scale_x_discrete() 因为它不会被绘制出来。

    tibble(lab = LETTERS[1:4],
           val = rexp(4)) %>%
    add_row(lab = "E", val = NA) %>%
    ggplot(aes(lab, val, group = 1)) +
    geom_line() +
    scale_x_discrete(breaks = c("A", "B", "C", "D")) +
    coord_radial(r.axis.inside = TRUE,
                 expand = FALSE)
    

    Second plot