【问题标题】:Bar graphs that don't start at 0 in RR中不从0开始的条形图
【发布时间】:2021-01-20 15:37:47
【问题描述】:

我试图展示一台机器的可用行程范围,该机器具有 360 度旋转,并且具有另一个与偏航无关的 -5 到 152 范围的运动轴。我能找到的所有条形图绘制函数都假设数据从 0 开始,这会在 -5 和 0 之间的图表中间留下一个洞。是否可以告诉 geom_bar() 或 geom_col() 开始绘制 - 5 而不是 0?

这是我正在使用的代码和示例图表。

df <- data.frame(0:360)
colnames(df) = "Yaw"
df$Max.Static <- ((runif(361) * 157)-5)

library(ggplot2)

ggplot(df, aes(x =Yaw , y = Max.Static)) + 
  geom_col(width = 1, alpha = .5 , fill = "#69B600") + 
  scale_y_continuous(
    limits = c(-5,152),
    breaks = seq(0,140,20)
    ) +
  scale_x_continuous(
    limits = c(-1,361),
    breaks = seq(0,360,45),
    minor_breaks = seq(0,360,15)
    ) +
  coord_polar(theta = "x") +
  labs(x = NULL, y = NULL) + 
  theme(axis.text.y = element_blank(),
        axis.ticks = element_blank())

【问题讨论】:

  • 变换你的数据,加上 5,使它从 0 开始,但调整标签,然后对标签进行逆变换,使开始标记为 -5。 (虽然在这个例子中没有半径标签,所以没有人会更聪明......)

标签: r ggplot2 geom-bar polar-coordinates


【解决方案1】:

有点奇怪,但如果您可以容忍警告,则以下方法有效:

df <- data.frame(0:360)
colnames(df) = "Yaw"
df$Max.Static <- ((runif(361) * 157)-5)

library(ggplot2)

ggplot(df, aes(x =Yaw , y = Max.Static)) + 
  geom_col(width = 1, alpha = .5 , fill = "#69B600",
           aes(ymin = after_scale(-Inf))) + ######## <- Change this line
  scale_y_continuous(
    limits = c(-5,152),
    breaks = seq(0,140,20)
  ) +
  scale_x_continuous(
    limits = c(-1,361),
    breaks = seq(0,360,45),
    minor_breaks = seq(0,360,15)
  ) +
  coord_polar(theta = "x") +
  labs(x = NULL, y = NULL) + 
  theme(axis.text.y = element_blank(),
        axis.ticks = element_blank())
#> Warning: Ignoring unknown aesthetics: ymin

reprex package (v0.3.0) 于 2021-01-20 创建

之所以有效,是因为我们可以在使用after_scale() 将条形参数化转换为矩形后访问矩形参数(xmin、xmax、ymin、ymax)。

-Inf 指示 ggplot 变量应处于刻度的最小值(即使在扩展之后),从而缩小差距。

【讨论】:

  • 是否有可能让它正确地绘制一个负值从 -5 到 -2 或者要求太多?
  • 我不是 100% 确定您的意思,但您可以将 -Inf 更改为您喜欢的任何内容。
  • 这实际上是一个奇怪的 hack,..;) 特别是因为您可以直接使用 geom_rect...
  • 使用geom_rect()geom_tile() 更合适,因为我滥用了用户无法使用的美学。但是,如果您使用标准矩形和图块,则必须重新参数化以声明 xmin/xmax 或宽度/高度。 geom_col/geom_bar 所做的好事就是为您重新参数化。
【解决方案2】:

从技术上讲,您应该查看 geom_segment 或 geom_rect,而不是 geom_bar,因为条形图在概念上表示计数,因此始终从 0 开始

这里是 geom_segment。无需破解。

df <- data.frame(0:360)
colnames(df) = "Yaw"
df$Max.Static <- ((runif(361) * 157)-5)
df$y <- -5

library(ggplot2)

ggplot(df, aes(Yaw , y, xend = Yaw, yend = Max.Static)) + 
  geom_segment( color = "#69B600", size = .2) + 
  scale_y_continuous(
    limits = c(-5,152),
    breaks = seq(0,140,20)
  ) +
  scale_x_continuous(
    limits = c(-1,361),
    breaks = seq(0,360,45),
    minor_breaks = seq(0,360,15)
  ) +
  coord_polar(theta = "x") +
  labs(x = NULL, y = NULL) + 
  theme(axis.text.y = element_blank(),
        axis.ticks = element_blank())

或者,使用 geom_rect,获得风车样式

    ggplot(df, aes(xmin = Yaw-0.4 , ymin = y, xmax = Yaw +0.4, ymax = Max.Static)) + 
      geom_rect( fill = "#69B600") + 
      scale_y_continuous(
        limits = c(-5,152),
        breaks = seq(0,140,20)
      ) +
      scale_x_continuous(
        limits = c(-1,361),
        breaks = seq(0,360,45),
        minor_breaks = seq(0,360,15)
      ) +
      coord_polar(theta = "x") +
      labs(x = NULL, y = NULL) + 
      theme(axis.text.y = element_blank(),
            axis.ticks = element_blank())

【讨论】:

  • 好点,条形图创建的连续区域就是我选择极坐标图的原因。对于随机数据,这并不明显,但我尝试将分段与真实数据一起使用,宽度必须足够大以弥合间隙以覆盖一些有用的数据,或者在数据恒定的图中存在间隙。
  • @BrettKSmith 不确定我是否理解。还有 geom_rect ,它应该使您的风车样式效果,请参阅添加的图表。我真的不认为 geom_bar 需要
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 2022-01-14
相关资源
最近更新 更多