#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. Спасибо за всю помощь. Три совершенно разных решения, и все они делают свое дело.