如何使用一个单独的数据集将geom_errorbars()添加到ggplot2中现有的geom_violin()数据集?

cl25kdpy  于 2023-03-15  发布在  其他
关注(0)|答案(1)|浏览(89)

问题:

如何正确地将使用不同(但相关!)数据集的geom_errorbar()堆叠在geom_violin()之上?

设置

我运行了一个招标,收到了多个运输路线的单个投标价格。然后,我选择了2或3个投标以创建加权平均决标价格。此外,对于每个运输路线,我收到了外部基准服务对该运输路线的最低和最高市场估计。在单个图中,我将显示:

  • geom_violin()所接收的投标价格的分布。
  • geom_jitter()的单个投标价格。
  • geom_point()单一加权平均/混合奖励。
  • X1 M5 N1 X(或相关的几何-优选地使用X1 M6 N1 X的阴影区域),其示出了该项目的低和高之间的市场估计。

为了尽量减少重复,我使用了2个 Dataframe ,一个包含每个项目的众多投标价格,另一个仅包含混合的授标和市场估计:

df_detail <- data.frame(item = c("Item_1", "Item_1", "Item_1", "Item_1", "Item_1",
                                 "Item_2", "Item_2", "Item_2", "Item_2", "Item_2", 
                                 "Item_3", "Item_3", "Item_3", "Item_3", "Item_3"), 
                        bid_price = c(6678, 3236, 4674, 5487, 5490, 
                                      5800, 6678, 3827, 4674, 5487, 
                                      2266, 1195, 1225, 3285, 1350))

df_summary <- data.frame(item = c("Item_1", "Item_2", "Item_3"), 
                         award = c(4278, 5844.32, 1244.31), 
                         mkt_low = c(4603, 4619, 833), 
                         mkt_high = c(5661, 5681, 1176))

目前为止的工作...

我从其他经验和阅读中了解到,您可以将主数据集放在对ggplot()的调用中并添加geom_*s(),还可以在自己的geom_*()调用中添加单独的数据集。在此调用中,除了geom_errorbar()之外,我可以轻松获取所有数据集:

library(ggplot2)

ggplot(data = df_detail, # Primary dataset using all the bid prices
       aes(x=item,
           y = bid_price)) + 
  geom_violin(fill = "gray90") +
  geom_jitter(color = "darkorchid2", 
              size = 0.75, 
              alpha = 1, 
              width = 0.15) +
  geom_point(data = df_summary, # Add summary dataset with single award point.
             aes(x = item, 
                 y = award), 
             color = "red") +
  theme_bw() +
  coord_cartesian(ylim = c(0,7000))

...我可以在他们自己的图中分别创建geom_errorbars(),其中包含每个项目的市场低点和高点:

ggplot(data = df_summary,
       mapping = aes(x = item,
                     ymin = mkt_low,
                     ymax = mkt_high)) +
geom_errorbar(width = 0.5) +
theme_bw() +
coord_cartesian(ylim = c(0,7000))

问题
我不能把它们放在同一个情节里:

ggplot(data = df_detail, 
       aes(x=item,
           y = bid_price)) + 
  geom_violin(fill = "gray90") +
  geom_jitter(color = "darkorchid2", 
              size = 0.75, 
              alpha = 1, 
              width = 0.15) +
  geom_point(data = df_summary, 
             aes(x = item, 
                 y = award), 
             color = "red") +
  geom_errorbar(data = df_summary,  # I am adding this geom_* call!!!!
                mapping = aes(x = item,
                              ymin = mkt_low,
                              ymax = mkt_high),
                width = 0.5) +
  theme_bw() +
  coord_cartesian(ylim = c(0,7000))

我在下面的跟踪中看到了上述错误。但是,我感到困惑,因为我没有遇到早期工作的geom_point()调用的问题。我不理解geom_errorbar()查找df_detail的一部分bid_price对象的过程。如果我运行rlang::last_trace(),我的技能不足以有效地破译此错误:

我觉得我在这里有一些重大的误解,我感谢任何提供的帮助。提前感谢你。

xpcnnkqh

xpcnnkqh1#

因为您在第1行的ggplot()调用中设置了data =df_detailaes(y = bid_price),所以它们将被继承为所有后续geom_* 的默认值。对于geom_errorbar()中的aes(y = )参数也是如此,无论为错误栏提供了什么自定义dataaes(x)参数。
要获得您想要的结果,可以在每个geom中设置y参数,而不是在ggplot(aes())调用中设置,或者简单地将geom_errorbaraes()Map的y参数设置为NULL。

ggplot(data = df_detail,
       aes(x=item,
           y = bid_price)) + 
  geom_violin(fill = "gray90") +
  geom_jitter(color = "darkorchid2", 
              size = 0.75, 
              alpha = 1, 
              width = 0.15) +
  geom_point(data = df_summary, 
             aes(x = item, 
                 y = award), 
             color = "red") +
  geom_errorbar(data = df_summary,  
                mapping = aes(x = item,
                              y = NULL, # Here!
                              ymin = mkt_low,
                              ymax = mkt_high),
                width = 0.5) +
  theme_bw() +
  coord_cartesian(ylim = c(0,7000))

相关问题