添加字符变量(工作日)到绘图

时间:2017-10-26 11:28:43

标签: r text ggplot2 character

plot

我想在工作日添加这个剧情作为栏目顶部的文字。 在我发现的ggplot中添加文本的唯一功能是“annotate”,它不能按我想要的方式工作。

它应该是这样的:

https://jsfiddle.net/4b8vqccs/

geom_text给了我这个 Plot with weekdays

我的代码:

    ggplot(data = filter(T2G2_dayav, site %in% c("S17S", "S17N"), !is.na(distance)),
       mapping = aes(as.factor(x = date_days))) +
  geom_col(mapping = aes(y = T2pn_av, fill = as.factor(distance)), 
           position = position_dodge(width = 0.9)) +

  theme_bw() + ylab("Particle Number (#/cm³), day-av") + xlab("Date") +
  scale_y_continuous(limits = c(0, 30000)) +
  scale_fill_discrete(name = "T2, Distance from road (m)") + 
  scale_color_grey(name = "Reference intrument G2") + 
  ggtitle("Day-averaged Particle Number (PN) per distance")

我的数据负责人:

distance  date_days  site  T2pn_av T2pn_avambient T2wdir_med weekday       Date  G2pn_av G2pn_min G2pn_max   G2ws_av G2ws_min G2ws_max G2wdir_med
     <int>     <dttm> <chr>    <dbl>          <dbl>      <dbl>   <chr>     <dttm>    <dbl>    <dbl>    <dbl>     <dbl>    <dbl>    <dbl>      <dbl>
1      -10 2017-07-18  S17N 28814.83      16917.831        110      Di 2017-07-18 13655.29     4621   105100 0.6781284        0      3.6       51.0
2      -10 2017-07-19  S17N 24210.95      15565.951        100      Mi 2017-07-19 10627.73     2908    67250 1.3673618        0      5.5       70.0
3      -10 2017-07-24  S17N 16143.44       7907.442         80      Mo 2017-07-24 11686.54     3582    55080 0.8178753        0      4.8       95.5
4      -10 2017-07-29  S17N 11762.56       5574.563        270      Sa 2017-07-29 12180.73     5413    45490 1.0304985        0      5.7      265.0
5      -10 2017-07-30  S17N 12138.22       6360.225        290      So 2017-07-30 10404.75     6113    23860 1.2385791        0      6.6      274.0
6      -10 2017-07-31  S17N 13815.32       9008.320        270      Mo 2017-07-31 11849.89     4595    46270 0.8554044        0      4.4      230.0

dput(头(T2G2_dayav))

structure(list(distance = c(-10L, -10L, -10L, -10L, -10L, -10L
), date_days = structure(c(1500328800, 1500415200, 1500847200, 
1501279200, 1501365600, 1501452000), class = c("POSIXct", "POSIXt"
), tzone = "Europe/Berlin"), site = c("S17N", "S17N", "S17N", 
"S17N", "S17N", "S17N"), T2pn_av = c(28814.8306772908, 24210.9512670565, 
16143.442364532, 11762.5630630631, 12138.2247114732, 13815.3198380567
), T2pn_avambient = c(16917.8306772908, 15565.9512670565, 7907.44236453202, 
5574.56306306306, 6360.22471147318, 9008.31983805668), T2wdir_med = c(110, 
100, 80, 270, 290, 270), weekday = c("Di", "Mi", "Mo", "Sa", 
"So", "Mo"), Date = structure(c(1500328800, 1500415200, 1500847200, 
1501279200, 1501365600, 1501452000), class = c("POSIXct", "POSIXt"
), tzone = "Europe/Berlin"), G2pn_av = c(13655.2885517401, 10627.7329973352, 
11686.5429216867, 12180.7308516181, 10404.7472642001, 11849.8893070109
), G2pn_min = c(4621, 2908, 3582, 5413, 6113, 4595), G2pn_max = c(105100, 
67250, 55080, 45490, 23860, 46270), G2ws_av = c(0.678128438241936, 
1.36736183524505, 0.817875347544022, 1.0304984658137, 1.23857912107, 
0.855404388351763), G2ws_min = c(0, 0, 0, 0, 0, 0), G2ws_max = c(3.6, 
5.5, 4.8, 5.7, 6.6, 4.4), G2wdir_med = c(51, 70, 95.5, 265, 274, 
230)), .Names = c("distance", "date_days", "site", "T2pn_av", 
"T2pn_avambient", "T2wdir_med", "weekday", "Date", "G2pn_av", 
"G2pn_min", "G2pn_max", "G2ws_av", "G2ws_min", "G2ws_max", "G2wdir_med"
), row.names = c(NA, -6L), class = c("grouped_df", "tbl_df", 
"tbl", "data.frame"), vars = c("distance", "date_days"), drop = TRUE, indices = list(
    0L, 1L, 2L, 3L, 4L, 5L), group_sizes = c(1L, 1L, 1L, 1L, 
1L, 1L), biggest_group_size = 1L, labels = structure(list(distance = c(-10L, 
-10L, -10L, -10L, -10L, -10L), date_days = structure(c(1500328800, 
1500415200, 1500847200, 1501279200, 1501365600, 1501452000), class = c("POSIXct", 
"POSIXt"), tzone = "Europe/Berlin")), row.names = c(NA, -6L), class = "data.frame", vars = c("distance", 
"date_days"), drop = TRUE, .Names = c("distance", "date_days"
)))

1 个答案:

答案 0 :(得分:2)

我们的想法是,您可以在每个栏上添加一个文字(这就是vjust = 0的原因,但您也可以vjust = -.5允许更多空格或vjust = 1.5将其放入酒吧,这也很好)。 geom_text中的其余部分基本上与geom_col中的相同。但总的来说,你可以将常用的美学放在ggplot(aes(...))中的第一次出现中,正如你已经对x值所做的那样。

ggplot(data = filter(T2G2_dayav, site %in% c("S17S", "S17N"), !is.na(distance)),
       mapping = aes(as.factor(x = date_days))) +
  geom_col(mapping = aes(y = T2pn_av, fill = as.factor(distance)), 
           position = position_dodge(width = 0.9)) +
  geom_text(aes(label = weekday, y = T2pn_av), vjust = -.5, # add these
            position = position_dodge(width = 0.9)) + # lines
  theme_bw() + ylab("Particle Number (#/cm³), day-av") + xlab("Date") +
  scale_y_continuous(limits = c(0, 30000)) +
  scale_fill_discrete(name = "T2, Distance from road (m)") + 
  scale_color_grey(name = "Reference intrument G2") + 
  ggtitle("Day-averaged Particle Number (PN) per distance")

enter image description here

以下内容应解决您的问题,标签太多。它采用最高标签并将其放置在该x值的条形中心。查找下面的图表,并在数据中添加其他行:

T2G2_dayav <- rbind(T2G2_dayav %>% ungroup(), T2G2_dayav %>% ungroup() %>% mutate(distance = 5)) # add more observations for testing

T2G2_dayav <- T2G2_dayav %>% mutate(T2pn_av = ifelse(distance == 5, T2pn_av/2, T2pn_av)) # label only the highest bar

以下内容适用于您的数据:

ggplot(data = filter(T2G2_dayav, site %in% c("S17S", "S17N"), !is.na(distance)) %>% 
    group_by(date_days) %>% # group by days
    mutate(weekday2 = ifelse(T2pn_av == max(T2pn_av), weekday, NA)), # within each day (group), only label the highest
       mapping = aes(as.factor(x = date_days))) +
    geom_col(mapping = aes(y = T2pn_av, fill = as.factor(distance)), 
             position = position_dodge(width = 0.9)) +
    geom_text(aes(label = weekday2, y = T2pn_av), vjust = -.5, # add these
              position = position_dodge(with = 0.9)) + # lines
    theme_bw() + ylab("Particle Number (#/cm³), day-av") + xlab("Date") +
    scale_y_continuous(limits = c(0, 30000)) +
    scale_fill_discrete(name = "T2, Distance from road (m)") + 
    scale_color_grey(name = "Reference intrument G2") + 
    ggtitle("Day-averaged Particle Number (PN) per distance")

enter image description here