【问题标题】:ggplot2: Overlapping elementsggplot2:重叠元素
【发布时间】:2017-01-14 22:49:14
【问题描述】:

我有一些关于一年中每个月的低温和高温平均温度的数据。我把它们放在一个条形图中,较低的温度高于较高的温度,以查看差异。但我只想有区别,所以重叠的(和图上的蓝色)是空白的。有什么方法可以处理ggplot中的重叠元素吗?

dat <- data.frame(1:12, 1:12, 1:12)
colnames(dat) <- c("Th", "Tl")
dat$code <- c("Jan",    "Feb",  "Mar",  "Apr",  "May",  "Jun",  "Jul",  "Aug",  "Sep",  "Oct",  "Nov",  "Dec")
dat$code <- factor(dat$code, levels = dat$code)
dat$Th <- c(42, 44, 53, 64, 75, 83, 87, 84, 78, 67, 55, 45)
dat$Tl <- c(27, 28, 35, 44, 54, 63, 68, 66, 59, 48, 38, 29)
dat

p <- ggplot(data = dat, aes(x = clim$code, y = Th)) +
      geom_col(show.legend = FALSE) +
      geom_bar(data = dat, aes(x = clim$code, y = Tl), fill = "blue", stat="identity")
p

【问题讨论】:

  • R 有一个内置的月份缩写向量month.abb,您可以使用它来节省一些输入。

标签: r ggplot2


【解决方案1】:

你可以用geom_segment近似一个条形图:

ggplot(dat, aes(x = code, xend = code, y = Th, yend = Tl)) + 
    geom_segment(size = 14, alpha = 0.7)

默认情况下,y 轴不再为零,但如果您想要它(温度可能不需要),您可以添加 expand_limits(y = 0)


如果您想实际使用geom_bar,您可以调整数据以便在一次调用中制作两组条形图,然后使用@987654329 将堆栈中较低的条形图的填充设置为RGB 值@ 作为额外的 alpha(不透明度)值。不过,这有点复杂:

library(tidyverse)

dat[-3] %>%    # calling a column `NA` causes problems
    mutate(Th = Th - Tl) %>%    # adjust top of stacked highs
    gather(var, val, Th, Tl) %>%    # reshape to long form
    ggplot(aes(x = code, y = val, fill = var)) + 
    geom_bar(stat = 'identity', show.legend = FALSE) + 
    scale_fill_manual(values = c(Th = 'gray30', Tl = '#00000000'))    # set fills/opacity

另外,因为每个人都在使用 geom_barstat = "identity" 这么多,所以添加了一个新的 geom_colstat = "identity" 作为默认值(h/t @hrbrmstr!),所以你可以弹出geom_col(show.legend = FALSE)如果您愿意,可以在上面,前提是您的 ggplot 是最新的。

【讨论】:

  • 谢谢。我有一个附加问题:如果我在较低的温度下做 geom_line(aes(x=clim$code, y=clim$Tl, group = 1)) 并且我想让片段在行中结束,那么我该怎么做?
  • 我不完全确定我理解你想要什么,但你可以翻转 yyend 美学(方向在这里无关紧要)所以你可以做到 ggplot(dat, aes(x = code, xend = code, y = Tl, yend = Th)) + geom_segment(size = 14, alpha = 0.7) + geom_line(group = 1)跨度>
  • geom_linerange 是这里的另一个选项:ggplot(data = dat, aes(x = code, ymin = Tl, ymax=Th)) + geom_linerange(size=10, colour="blue")
  • @eipi10 这实际上更好;老实说,如果不检查文档,我不记得哪些几何学采用哪种美学。也许我会做一张桌子......
  • @Alistaire 这不是我所说的。这只是关于点,无论是线还是条。我想根据线轨迹在整个宽度上切割块的下部。 (只是理论上,我知道它对这个确切的情况没有多大用处)
猜你喜欢
  • 1970-01-01
  • 2012-12-07
  • 2012-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多