【问题标题】:Issue with a drawing a vertical line in ggplot for categorical variable x-axis in R在 ggplot 中为 R 中的分类变量 x 轴绘制垂直线的问题
【发布时间】:2017-11-07 04:00:25
【问题描述】:

我有下表。我想使用每个县的“st_date_wk”列绘制一条垂直线。请参阅下面的代码,但它没有使用“st_date_wk”列绘制垂直线。无法弄清楚我在这里做错了什么。

感谢任何帮助。

谢谢。

dfx1:

YEAR     Week       Area    acc_sum    percentage COUNTY st_date_wk    
1998     10-1       250     250        12.4       133    10-4
1998     10-2       300     550        29.0       133    10-4   
1998     10-3        50     600        58.0       133    10-4
1998     10-4       100     700        75.9       133    10-4
1998     10-5       100     800       100.0       133    10-4
1999     9-3         75      75        22.0       205    10-2
1999     10-1       250     250        12.4       205    10-2
1999     10-2       300     550        29.0       205    10-2   
1999     10-3        50     600        58.0       205    10-2
1999     10-4       100     700        75.9       205    10-2
1999     10-5       100     800       100.0       205    10-2
.
.

dfx1$YEAR <- as.factor(dfx1$YEAR)
dfx1$COUNTY <- as.factor(dfx1$COUNTY)
dfx1$percentage <- as.numeric(dfx1$percentage)
dfx1$acc_sum <- as.numeric(dfx1$acc_sum)
dfx1$Week <- factor(dfx1$Week, ordered = T)
dfx1$st_date_wk <- factor(dfx1$st_date_wk,ordered = T)

dfx1$Week <- factor(dfx1$Week, levels=c("6-1","6-2","6-3","6-4","6-5","7-1","7-2","7-3","7-4","7-5","8-1","8-2","8-3","8-4","8-5","9-1","9-2","9-3","9-4","9-5","10-1","10-2","10-3","10-4","10-5","11-1","11-2","11-3","11-4","11-5","12-1","12-2","12-3","12-4","12-5"))

gg <- ggplot(dfx1, aes(Week,percentage, col=YEAR, group = YEAR))
gg <- gg + geom_line()
gg <- gg + facet_wrap(~COUNTY, 2, scales = "fixed")
gg <- gg + theme(text = element_text(size=15), axis.text.x = element_text(angle=90, hjust=1))
gg <- gg + geom_vline(data=dfx1, aes(xintercept = dfx1$st_date_wk), color = "blue", linetype = "dashed", size = 1.0)+  facet_wrap(~COUNTY)

  plot(gg)

1: In Ops.ordered(x, from[1]) : '-' is not meaningful for ordered factors

【问题讨论】:

    标签: r ggplot2 line


    【解决方案1】:

    这是一个非常有趣的问题,我还没有完全弄清楚为什么它不起作用。但是,有一个解决方法。

    首先,这是答案中使用的数据:

    dfx1 <- read.table(text = 
                         "YEAR     Week       Area    acc_sum    percentage COUNTY st_date_wk    
                       1998     10-1       250     250        12.4       133    10-4
                       1998     10-2       300     550        29.0       133    10-4   
                       1998     10-3        50     600        58.0       133    10-4
                       1998     10-4       100     700        75.9       133    10-4
                       1998     10-5       100     800       100.0       133    10-4
                       1999     9-3         75      75        22.0       133    10-1", 
                       header = TRUE)
    

    转换YearCOUNTYpercentageacc_sum的类型:

    dfx1$YEAR <- as.factor(dfx1$YEAR)
    dfx1$COUNTY <- as.factor(dfx1$COUNTY)
    dfx1$percentage <- as.numeric(dfx1$percentage)
    dfx1$acc_sum <- as.numeric(dfx1$acc_sum)
    

    使用 week_levels 创建一个向量(更易于阅读):

    week_levels <- c("6-1","6-2","6-3","6-4","6-5",
                     "7-1","7-2","7-3","7-4","7-5",
                     "8-1","8-2","8-3","8-4","8-5",
                     "9-1","9-2","9-3","9-4","9-5",
                     "10-1","10-2","10-3","10-4","10-5",
                     "11-1","11-2","11-3","11-4","11-5",
                     "12-1","12-2","12-3","12-4","12-5")
    

    Weekst_date_wk 转换为具有相同水平的有序因子:

    dfx1$Week <- factor(dfx1$Week, levels = week_levels, ordered = TRUE)
    dfx1$st_date_wk <- factor(dfx1$st_date_wk, levels = week_levels, ordered = TRUE)
    

    scale_x_discrete(命名向量,其中名称对应于 x 轴的断点)创建标签:

    labels <- week_levels 
    names(labels) <- seq_along(week_levels)
    

    创建可视化,但不是使用 x 轴上的因子,而是使用数字,在 geom_vline() 中使用 which() 来获取与 x 轴上的 Week 对应的数字。然后使用scale_x_discrete() 添加周数。

    library(ggplot2)
    
    ggplot(dfx1, aes(x = as.numeric(Week), y = percentage, col=YEAR, group = YEAR)) + 
      geom_line() +
      geom_vline(xintercept = which(levels(dfx1$Week) %in% dfx1$st_date_wk), color = "blue", linetype = "dashed") +
      scale_x_continuous(breaks = seq_along(labels), labels = labels) + 
      theme(text = element_text(size=15), axis.text.x = element_text(angle=90, hjust=1)) +
      facet_wrap(~COUNTY, 2, scales = "fixed")
    

    这会给你:

    评论后编辑:

    library(dplyr)
    dfx1 <- merge(dfx1, 
                  (dfx1 %>% 
                     group_by(COUNTY, st_date_wk) %>% 
                     summarise(x = which(levels(st_date_wk) %in% st_date_wk[COUNTY == COUNTY]))),
                  by = c("COUNTY", "st_date_wk"), all.x = TRUE
    )
    
    ggplot(dfx1, aes(x = as.numeric(Week), y = percentage, col=YEAR, group = YEAR)) + 
      geom_line() +
      geom_vline(data = dfx1, aes(xintercept = x), color = "blue", linetype = "dashed") +
      scale_x_continuous(breaks = seq_along(labels), labels = labels) + 
      theme(text = element_text(size=15), axis.text.x = element_text(angle=90, hjust=1)) +
      facet_wrap(~COUNTY, 2, scales = "fixed")
    

    【讨论】:

    • 谢谢。我对上表进行了修改。如何获得每个“COUNTY”和情节的唯一“st_date_wk”?我想显示每个 COUNTY 的唯一虚线。
    • 我已经修改了答案,但是,最好创建一个新问题而不是更改它。
    【解决方案2】:

    您只需更改geom_vline 中的aes

    aes(xintercept = dfx1$st_date_wk %>% as.numeric())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多