在ggplot中绘制一条垂直线的问题,用于R中的分类变量x轴

时间:2017-11-07 04:00:25

标签: r ggplot2 line

我有下表。我想使用" 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

2 个答案:

答案 0 :(得分:0)

您只需更改aes

中的geom_vline即可
aes(xintercept = dfx1$st_date_wk %>% as.numeric())

答案 1 :(得分:0)

这是一个非常有趣的问题,我还没弄清楚为什么它不起作用。但是,它有一个修复。

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

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")

这会给你:

enter image description here

评论后编辑:

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")

with_county