【问题标题】:Add data labels from a second data frame to ggplot that contains geom_path()将第二个数据框中的数据标签添加到包含 geom_path() 的 ggplot
【发布时间】:2021-03-09 03:39:20
【问题描述】:

我试图在几个时间点(几周)内比较一个周期中不同组件的持续时间。理想情况下,情节应如下所示:

根据需要使用数据标签的循环时间

我能够生成下面的图(代码如下),但无法向图表添加数据标签。

使用需要数据标签的 geom_path() 绘图

我从以下绘制了这个:

  1. df1:每周累积平均持续时间(geom_path() 和 geom_point() 阅读此内容)
week variable value

23   Step 1   0.14

24   Step 1   0.21

23   Step 2   0.25

24   Step 2   0.35

23   Step 3   0.53

24   Step 3   0.65
  1. df2:每周平均持续时间(数据标签来自这里)
week variable value

23   Step 1   0.14

24   Step 1   0.21

23   Step 2   0.11

24   Step 2   0.14

23   Step 3   0.28

24   Step 3   0.30

我的ggplot代码是:

ggplot(df1, aes(x=value, y=week))+
  geom_path(mapping=NULL, data=df1,stat="identity", lineend="butt")+
  geom_point(aes(colour=variable, size=0.5))+
  labs(title="Average cycle time, by components by week",
       x="Number of days",
       y="Week in the year")+
  theme(axis.text=element_text(size=9),
        axis.title=element_text(size=12,face="bold"))+
  #annotate(geom="text",df2, aes(label=value)),
  #         hjust=1, vjust=-0.1)

如果我尝试注释行,我会得到一个空白图,并出现以下错误:

Error in is.finite(x) : default method not implemented for type 'list'

我觉得这可能与我指定 df1 和 df2 的方式有关?

关于如何添加这些数据标签有什么想法吗?

【问题讨论】:

    标签: r ggplot2 labeling


    【解决方案1】:

    你的data.frame,和你添加的第一步:

    df = data.frame(week=c(23,24,23,24,23,24),
    variable=rep(c("Step 1","Step 2","Step 3"),each=2),
    value=c(0.14,0.21,0.11,0.14,0.28,0.30))
    
    df$week = factor(df$week)
    
    df = rbind(data.frame(week=unique(df$week),variable="Step 0",value=0),df)
    

    您在第二个数据框中的内容是正确的。您还可以使用两个数据框进行绘图。下面我使用函数cumsum()动态计算累积值。

    您可以使用geom_text()annotate(),但是当您的标签接近时,您需要排斥它们,所以我在下面使用了ggrepel:

    library(ggrepel)
    
    ggplot(df,aes(x=cumsum(value),y=week)) + 
    geom_line(aes(group=week),col="black") +
    geom_point(aes(col=variable)) +
    geom_text_repel(data=subset(df,variable!="Step 0"),
    aes(x=cumsum(value)-value/2,y=week,label=value,group=week))
    theme_minimal()
    

    【讨论】:

      【解决方案2】:

      我建议使用geom_text,而不是使用annotate(没有数据参数,因此会出现错误)。但是,我更喜欢的方法不是同时使用两个 dfs,而是加入两个数据集:

      library(ggplot2)
      library(dplyr)
      
      df1 <- read.table(text = "week variable value
      23   Step_1   0.14
      24   Step_1   0.21
      23   Step_2   0.25
      24   Step_2   0.35
      23   Step_3   0.53
      24   Step_3   0.65", header = TRUE)
      
      df2 <- read.table(text = "week variable value
      23   Step_1   0.14
      24   Step_1   0.21
      23   Step_2   0.11
      24   Step_2   0.14
      23   Step_3   0.28
      24   Step_3   0.30", header = TRUE)
      
      df3 <- df1 %>% 
        left_join(df2, by = c("week", "variable"), suffix = c("", "_lab"))
        
      ggplot(df3, aes(x=value, y=week))+
        geom_path(mapping=NULL, data=df1,stat="identity", lineend="butt")+
        geom_point(aes(colour=variable, size=0.5))+
        labs(title="Average cycle time, by components by week",
             x="Number of days",
             y="Week in the year")+
        theme(axis.text=element_text(size=9),
              axis.title=element_text(size=12,face="bold"))+
        geom_text(aes(label=value_lab),
                 hjust=1, vjust=-0.1)
      

      以防万一。如果您想同时使用两个 dfs:

      ggplot(df1, aes(x=value, y=week))+
        geom_path(mapping=NULL, data=df1,stat="identity", lineend="butt")+
        geom_point(aes(colour=variable, size=0.5))+
        labs(title="Average cycle time, by components by week",
             x="Number of days",
             y="Week in the year")+
        theme(axis.text=element_text(size=9),
              axis.title=element_text(size=12,face="bold"))+
        geom_text(data = df2, aes(label=value),
                 hjust=1, vjust=-0.1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2022-07-23
        • 1970-01-01
        • 2017-02-01
        • 1970-01-01
        相关资源
        最近更新 更多