【问题标题】:Assigning geom_text from a different dataframe labels to a graph将 geom_text 从不同的数据框标签分配给图形
【发布时间】:2019-07-19 19:40:21
【问题描述】:

所以我正在使用 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

我想做的是在每个栏上方添加文本,以反映设备负责的推文活动百分比。

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

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

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

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

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

    处理这个问题的最ggplot-ish 方法是将它们合并成一个data.frame,因为data.frames 共享一个共同的密钥:设备。这简化了ggplot2 代码。首先,我将制定一个不合并的解决方案,然后我将向您展示如何将您的两个 data.frames 合并在一起。

    我生成的数据看起来与您的数据类似:

    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 不要使用绘图的默认 data.framemydf,而是使用 prop_df 而不是 > 用于该层。
    • 在我的 aes 调用中,我告诉 ggplot 将 device 映射到 x 轴,然后我将 y 值硬编码为最大设备数的 110%,因此它们将全部显示在相同的高度,只是栏杆上方。
    • ggplot2,默认情况下会尝试缩小绘图区域以匹配您绘制的数据,我想要更多的喘息空间,所以我使用expand_scale(mult = c(0, .1) 将绘图在 y 方向上扩展 110%。

    这与您正在寻找的相似吗?

    然后我继续简化 ggplot 调用,将两个 data.frames 与之前的 dplyr::left_join 连接在一起:

    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 参数。

    你怎么看?

    【讨论】:

    • 非常感谢,看来组合表格是最优雅的解决方案。我被洞悉了,尝试另一种方法来得到它,这让我把头发拔了出来!
    • 你打赌。在您猜出使您的数据与 ggplot 一起工作的最不痛苦的方法之前,您可能需要进行几次尝试。如果我的回答足够,您能否将其标记为解决方案?
    • 使用您的建议,我现在得到了类似的结果,百分比 amt 就在条形上方。谢谢一吨!!! i.gyazo.com/c2162e5e39a2f5b293c5d4da534c8be5.png
    • 太好了,很高兴您可以将它应用到您的示例中。干得好!
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多