gpt4 book ai didi

r - 在 ggplot 上覆盖 mustache 或错误栏式线条

转载 作者:行者123 更新时间:2023-12-04 11:22:12 25 4
gpt4 key购买 nike

我正在创建类似于下面第一个示例图像的绘图,并且需要类似于下面第二个示例的绘图。

library(ggplot2)
library(scales)

# some data
data.2015 = data.frame(score = c(-50,20,15,-40,-10,60),
area = c("first","second","third","first","second","third"),
group = c("Findings","Findings","Findings","Benchmark","Benchmark","Benchmark"))

data.2014 = data.frame(score = c(-30,40,-15),
area = c("first","second","third"),
group = c("Findings","Findings","Findings"))

# breaks and limits
breaks.major = c(-60,-40,-22.5,-10, 0,10, 22.5, 40, 60)
breaks.minor = c(-50,-30,-15,-5,0, 5, 15,30,50)
limits =c(-70,70)

# plot 2015 data
ggplot(data.2015, aes(x = area, y = score, fill = group)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
coord_flip() +
scale_y_continuous(limit = limits, oob = squish, minor_breaks = breaks.minor, breaks = breaks.major)

sample plot

data.2014 只有“发现”组的值。我想在图上显示那些 2014 年的发现值,在适当的/对应的数据上。2015$area,那里有 2014 年的数据可用。

为了仅在“查找”(红色条)数据上显示去年的数据,我想使用来自相关 data.2015 条的值的单边误差条/须线,并终止于 data.2014值,例如:

ideal plot

我想通过使用图层和绘制误差线来做到这一点,以便 2015 年的数据可以重叠,但是当 2014 年的结果 abs() 小于 2015 年的结果并因此被遮挡时,这不起作用。

注意事项:
  • 我希望误差条/ mustache 与条形图的宽度相同,甚至可能是带有实心帽的虚线。
  • 值减少时红线的奖励积分,值增加时为绿色的奖励积分
  • 我在一个循环中生成了很多这样的图,有时有很多组,每个图中的区域数量不同。 2014 年的数据(在这个阶段)总是只显示一个组,每个区域都有一些数据(除了只有一个 NA 案例,但需要为该场景提供)

  • 编辑

    所以我添加到下面的解决方案中,我使用了那个确切的代码,而是使用了 geom_linerange所以它会添加没有大写的线条,然后我还使用了 geom_errorbar ,但将 ymin 和 ymax 设置为相同的值,因此结果是 ggplot 中的单边误差条 geom_bar !谢谢您的帮助。

    最佳答案

    我相信你可以通过一点数据操作来获得你想要的大部分内容。对两个数据集进行外连接可以让您添加带有适当减淡的误差线。

    alldat = merge(data.2015, data.2014, all = TRUE, by = c("area", "group"), 
    suffixes = c(".2015", ".2014"))

    要使误差条偏向一边,您需要 yminy 相同或 NA取决于组。创建一个新变量似乎最容易,我称之为 plotscore , 为达到这个。
    alldat$plotscore = with(alldat, ifelse(is.na(score.2014), NA, score.2015))

    我做的最后一件事是创建一个变量 direction与 2014 年相比,2015 年的分数是下降还是上升。我为 Benchmark 添加了第三个类别分组作为填充物,因为我在没有它的情况下遇到了一些闪避问题。
    alldat$direction = with(alldat, ifelse(score.2015 < score.2014, "dec", "inc"))
    alldat$direction[is.na(alldat$score.2014)] = "absent"

    用于绘图的数据集如下所示:
        area     group score.2015 score.2014 plotscore direction
    1 first Benchmark -40 NA NA absent
    2 first Findings -50 -30 -50 dec
    3 second Benchmark -10 NA NA absent
    4 second Findings 20 40 20 dec
    5 third Benchmark 60 NA NA absent
    6 third Findings 15 -15 15 inc

    我使用的最终代码如下所示:
    ggplot(alldat, aes(x = area, y = score.2015, fill = group)) +
    geom_bar(stat = "identity", position = position_dodge(width = 0.9)) +
    geom_errorbar(aes(ymin = plotscore, ymax = score.2014, color = direction),
    position = position_dodge(width = .9), lwd = 1.5, show.legend = FALSE) +
    coord_flip() +
    scale_y_continuous(limit = limits, oob = squish, minor_breaks = breaks.minor, breaks = breaks.major) +
    scale_color_manual(values = c(NA, "red", "green"))

    enter image description here

    我正在使用 ggplot2、ggplot2_1.0.1.9002 和 show_guide 的开发版本现在已弃用,取而代之的是 show.legend ,我在 geom_errorbar 中使用过.

    显然,我没有将误差线的线型更改为带有实心帽的虚线,也没有移除底部的须线,因为我不知道做这些事情的简单方法。

    关于r - 在 ggplot 上覆盖 mustache 或错误栏式线条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32065339/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com