gpt4 book ai didi

r - 将来自不同数据框标签的 geom_text 分配给图形

转载 作者:行者123 更新时间:2023-12-05 05:09:54 24 4
gpt4 key购买 nike

所以我正在使用 Twitter API 来收集与特定主题相关的信息,我正在可视化的事情之一是设备的流行程度。

到目前为止,我有这个: https://gyazo.com/441a9ab80b943f9e0c3a36131273844a

上面是这段代码生成的:

device_types_condensed <- (ggplot(manu_tweets3, aes(x= statusSource_clean , fill = isRetweet)) + geom_bar() 
+ theme(panel.background=element_rect(fill='white'),
axis.ticks.x=element_blank(),
axis.text.x=element_blank())
+ theme(axis.ticks.x=element_blank(), axis.text.x = element_text(angle = 25),
axis.text=element_text(size=8))
+ labs(x="", title = "Device Popularity for Tweet or Retweet Usage", y ="No. of Tweets on Device")
)
device_types_condensed

我想做的是在每个栏上方添加文本,以反射(reflect)该设备负责的推文事件的百分比。

这意味着我没有改变 y 轴。 y 轴仍然反射(reflect)推文的数量,条形顶部的数字将反射(reflect)百分比。到目前为止,我已经有了一个用该值制作的表格: https://i.gyazo.com/5f14d2c1352e8c9c2c5997678ceea3b4.png

我一辈子都想不通的是如何选择上表中的 % 标签,然后根据设备类型将它们应用到 ggplot 图表。

抱歉,没有代表发布图片,但我链接了 URL!

最佳答案

你很接近。我无法访问您的确切数据,因此我简化了您的问题。你说你有一些设备,每个设备都有一些与这些设备相关的推文,并且每个设备都有一个单独的比例与之相关。您还说过这些在两个不同的 data.frame 中。

处理这个问题的最 ggplot 风格的方法是将它们连接到一个 data.frame 中,因为 data.frame共享一个公用 key :设备。这简化了 ggplot2 代码。首先,我将制定一个不合并的解决方案,然后我将向您展示如何将两个 data.frame 合并在一起。

我生成的数据看起来与您的数据类似,如下所示:

mydf <- data.frame(device = c("A", "B", "C"),
num_tweets = c(100, 200, 50))

prop_df <- data.frame(device = c("A", "B", "C"),
proportion = c(.29, .57, .14))

如果不先将它们连接在一起,我认为您可以使用如下代码获得所需的内容:

ggplot(mydf) +
geom_col(aes(device,
num_tweets)) +
geom_text(data = prop_df,
aes(device,
max(mydf$num_tweets * 1.10),
label = paste0(proportion * 100, "%"))) +
scale_y_continuous(expand = expand_scale(mult = c(0, .1)))

注意一些事情:

  • 我调用 geom_text 来获取要显示的百分比,因为我希望 ggplot2 为我处理 x 位置(以匹配调用 geom_col 时已经显示的内容) > 就在它上面)所以条形图和百分比匹配。
  • geom_text 调用的第一个参数 data = prop_df 告诉 geom_text 不要使用绘图的默认 数据。 framemydf,并为该层使用 prop_df 而不是
  • 在我的 aes 调用中,我告诉 ggplot 将 device 映射到 x 轴,然后我将 y 值硬编码为最大设备数的 110%,因此它们将全部显示在相同的高度,就在条形图上方。
  • ggplot2,默认情况下,尝试缩小绘图区域以匹配您绘制的数据,我想要更多的喘息空间,所以我使用了 expand_scale(mult = c(0, .1) 将图在 y 方向上扩大 110%。

这是否与您正在寻找的相似?

enter image description here

然后我继续并通过将两个 data.framedplyr::left_join 连接在一起来简化 ggplot 调用:

library(dplyr)

mydf <- left_join(mydf, prop_df)

ggplot(mydf) +
geom_col(aes(device,
num_tweets)) +
geom_text(aes(device,
max(mydf$num_tweets * 1.10),
label = paste0(proportion * 100, "%"))) +
scale_y_continuous(expand = expand_scale(mult = c(0, .1)))

只是稍微短了一点,不需要您覆盖 geom_text 中的 data 参数。

你怎么看?

关于r - 将来自不同数据框标签的 geom_text 分配给图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57118790/

24 4 0