Метки на сгруппированной столбчатой диаграмме с несколькими группами

#r #ggplot2

Вопрос:

Я хочу показать метки на сгруппированной гистограмме. В stackoverflow есть несколько ответов на этот вопрос, которые я пробовал, но ни один из них не работает в моем приложении.

На моем графике показана группа баров за два квартала, 4 квартал 2020 года и 1 квартал 2021 года. Надписи не отображаются поверх полос, как следовало бы. Я обнаружил, что когда я меняю диаграмму, чтобы показывать бары только за 4 квартал 2020 года или только за 1 квартал 2021 года, метки отображаются правильно, но когда я показываю оба квартала вместе для целей сравнения, метки больше не отображаются там, где должны. Вот мой репрекс. Помощь оценена по достоинству.

 Date <- as.Date(c("2020-10-01","2020-10-01","2020-10-01","2020-10-01",
  "2020-10-01","2020-10-01","2020-10-01","2020-10-01","2020-10-01",
  "2020-10-01","2020-10-01","2020-10-01","2020-10-01","2020-10-01",
  "2021-01-01","2021-01-01","2021-01-01","2021-01-01","2021-01-01",
  "2021-01-01","2021-01-01","2021-01-01","2021-01-01","2021-01-01",
  "2021-01-01","2021-01-01","2021-01-01","2021-01-01"))
GEO <- c(
"Canada","Newfoundland and Labrador","Prince Edward Island",     
"Nova Scotia","New Brunswick","Quebec","Ontario","Manitoba","Saskatchewan",             
"Alberta","British Columbia","Yukon","Northwest Territories","Nunavut",
"Canada","Newfoundland and Labrador","Prince Edward Island","Nova Scotia",              
"New Brunswick","Quebec","Ontario","Manitoba","Saskatchewan","Alberta",                  
"British Columbia","Yukon","Northwest Territories","Nunavut")
JVR <- c(3.5,2.6,3.2,3.3,3.9,4.1,3.4,3.1,2.3,2.4,4.2,4.4,3.0,2.6,
  3.6,2.0,2.5,3.2,3.2,4.2,3.3,3.1,2.7,2.8,4.5,4.7,4.2,3.6)
df <- data.frame(Date=as.Date(Date),GEO=GEO,JVR=JVR)
ggplot(filter(df,Date>=as.Date("2020-10-01")),aes(x=Date,y=JVR,fill=GEO))  
  geom_bar(stat="identity",position="dodge")  
  geom_text(aes(label=JVR,group=GEO),position=position_dodge(width=0.9),
    vjust=-1,size=3)
 

Комментарии:

1. width=90 для текста дож кажется правильным, но я не уверен, как это сделать без проб и ошибок

Ответ №1:

ggfittext Пакет может помочь здесь. Если вы хотите иметь одинаковые размеры текста для надписей, вам , вероятно, потребуется преобразовать их с помощью format , в противном случае, например, число «3» будет отображаться больше, чем «3.1», чтобы поместиться в строке.

получить данные

 library(tidyverse)

Date <- as.Date(c("2020-10-01","2020-10-01","2020-10-01","2020-10-01",
                  "2020-10-01","2020-10-01","2020-10-01","2020-10-01","2020-10-01",
                  "2020-10-01","2020-10-01","2020-10-01","2020-10-01","2020-10-01",
                  "2021-01-01","2021-01-01","2021-01-01","2021-01-01","2021-01-01",
                  "2021-01-01","2021-01-01","2021-01-01","2021-01-01","2021-01-01",
                  "2021-01-01","2021-01-01","2021-01-01","2021-01-01"))
GEO <- c(
  "Canada","Newfoundland and Labrador","Prince Edward Island",     
  "Nova Scotia","New Brunswick","Quebec","Ontario","Manitoba","Saskatchewan",             
  "Alberta","British Columbia","Yukon","Northwest Territories","Nunavut",
  "Canada","Newfoundland and Labrador","Prince Edward Island","Nova Scotia",              
  "New Brunswick","Quebec","Ontario","Manitoba","Saskatchewan","Alberta",                  
  "British Columbia","Yukon","Northwest Territories","Nunavut")
JVR <- c(3.5,2.6,3.2,3.3,3.9,4.1,3.4,3.1,2.3,2.4,4.2,4.4,3.0,2.6,
         3.6,2.0,2.5,3.2,3.2,4.2,3.3,3.1,2.7,2.8,4.5,4.7,4.2,3.6)
df <- data.frame(Date=as.Date(Date),GEO=GEO,JVR=JVR)

 

данные графика

 library(ggplot2)
library(ggfittext)
d.plot <- filter(df,Date>=as.Date("2020-10-01"))

ggplot(d.plot, aes(x=Date,y=JVR,fill=GEO,label=format(JVR, digits = 2)))  
  geom_bar(stat="identity",position="dodge")  
  # from `ggfittext`
  geom_bar_text(position="dodge",
                place="top",grow=F,reflow=F,min.size=0)  
  theme_bw()
 

Создано 2021-09-20 пакетом reprex (v2.0.1)

Ответ №2:

Я думаю, что проблема в непрерывной Date переменной на оси x. В вашем примере с x=Date этот position_dodge(width= 0.9) параметр не работает.

Но если вы преобразуете две интересующие даты в факторы (например 2020 Q4 , и 2021 Q1 ) width = 0.9 , параметр работает. В этом примере, я думаю, это дает более значимую ось x, поэтому вы не путаете уклоняющиеся полосы для разных дат.

Примечание geom_col эквивалентно geom_bar(stat = 'identity') .

 # does not work
ggplot(df, aes(x=Date, y=JVR, fill=GEO))  
  geom_col(position = 'dodge')  
  geom_text(aes(label=JVR), position = position_dodge(width = .9))
 

 # works

df %>%
  mutate(quarter = case_when(
    Date == "2020-10-01" ~ '2020 Q4',
    Date == "2021-01-01" ~ '2021 Q1')) %>%
  ggplot(aes(x=quarter, y=JVR, fill=GEO))  
  geom_col(position = 'dodge')  
  geom_text(aes(label=JVR), position = position_dodge(width = .9))
 

Создано 2021-09-20 с помощью пакета reprex (версия 2.0)


Данные

 library(tidyverse)

Date <- as.Date(c("2020-10-01","2020-10-01","2020-10-01","2020-10-01",
  "2020-10-01","2020-10-01","2020-10-01","2020-10-01","2020-10-01",
  "2020-10-01","2020-10-01","2020-10-01","2020-10-01","2020-10-01",
  "2021-01-01","2021-01-01","2021-01-01","2021-01-01","2021-01-01",
  "2021-01-01","2021-01-01","2021-01-01","2021-01-01","2021-01-01",
  "2021-01-01","2021-01-01","2021-01-01","2021-01-01"))
GEO <- c(
"Canada","Newfoundland and Labrador","Prince Edward Island",     
"Nova Scotia","New Brunswick","Quebec","Ontario","Manitoba","Saskatchewan",             
"Alberta","British Columbia","Yukon","Northwest Territories","Nunavut",
"Canada","Newfoundland and Labrador","Prince Edward Island","Nova Scotia",              
"New Brunswick","Quebec","Ontario","Manitoba","Saskatchewan","Alberta",                  
"British Columbia","Yukon","Northwest Territories","Nunavut")
JVR <- c(3.5,2.6,3.2,3.3,3.9,4.1,3.4,3.1,2.3,2.4,4.2,4.4,3.0,2.6,
  3.6,2.0,2.5,3.2,3.2,4.2,3.3,3.1,2.7,2.8,4.5,4.7,4.2,3.6)
df <- data.frame(Date=as.Date(Date),GEO=GEO,JVR=JVR)
 

Комментарии:

1. повышен голос из-за более значимой оси x.

2. Спасибо за всю помощь. Три совершенно разных решения, и все они делают свое дело.