Отображение всех меток оси x для дискретной переменной на гистограмме ggplot

#r #ggplot2 #bar-chart #axis-labels #zoo

#r #ggplot2 #гистограмма #оси-метки #зоопарк

Вопрос:

У меня есть набор данных, и я хочу построить гистограмму для данных. Пример данных показан ниже:

    yq        flag      n ratio
   <yearqtr> <fct> <int> <dbl>
 1 2011 Q1   0       269 0.610
 2 2011 Q1   1       172 0.390
 3 2011 Q2   0       266 0.687
 4 2011 Q2   1       121 0.313
 5 2011 Q3   0       239 0.646
 6 2011 Q3   1       131 0.354
 7 2011 Q4   0       153 0.668
 8 2011 Q4   1        76 0.332
 9 2012 Q1   0       260 0.665
10 2012 Q1   1       131 0.335
11 2012 Q2   0       284 0.676
12 2012 Q2   1       136 0.324
13 2012 Q3   0       197 0.699
14 2012 Q3   1        85 0.301
15 2012 Q4   0       130 0.688
16 2012 Q4   1        59 0.312
17 2013 Q1   0       273 0.705
18 2013 Q1   1       114 0.295
19 2013 Q2   0       333 0.729
20 2013 Q2   1       124 0.271
  

То, что я хочу сделать, это в основном построение соотношения для каждого флага в каждом квартале. Я написал приведенный ниже код:

 data$flag <- as.factor(data$flag)
ggplot(data=data, aes(x=yq, y=ratio, fill=flag))  
  geom_bar(stat="identity", color="black", position=position_dodge()) 
  theme_minimal()  
  scale_fill_manual(values=c('#999999','#E69F00'))
  

Результат показан ниже:

результат кода

Но на самом деле я хочу показать все четверти по оси x и, возможно, в вертикальной форме для лучшей визуализации. Однако я попытался использовать scale_x_discrete(limits=yq) , это неправильный ответ и возвращает ошибку. Как я могу это сделать?

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

1. В следующий раз, пожалуйста, предоставьте свои данные как dput(data) , это сэкономит нам время на повторное создание ваших данных.

2. @zx8754 Вы правы. Я должен был это сделать. спасибо за ваш комментарий

Ответ №1:

Похоже, что ваш yq столбец находится в формате год-квартал (как определено в zoo пакете). Для ggplot может быть лучше преобразовать это в формат даты и указать разрывы следующим образом:

 library(ggplot2)
library(zoo)

data$flag <- as.factor(data$flag)

ggplot(data=data, aes(as.Date(yq), ratio, fill = flag))  
  geom_col(color="black", position = position_dodge())  
  scale_x_date(date_breaks = "3 months", guide = guide_axis(n.dodge = 2))  
  labs(x = "Year / Quarter")  
  scale_fill_manual(values=c('#999999','#E69F00'))  
  theme_minimal() 
  

Или вы могли бы сложить столбцы:

 
ggplot(data=data, aes(as.Date(yq), ratio, fill = flag))  
  geom_col(color="black", position = position_stack())  
  scale_x_date(date_breaks = "3 months", guide = guide_axis(n.dodge = 2))  
  labs(x = "Year / Quarter")  
  scale_fill_manual(values=c('#999999','#E69F00'))  
  theme_minimal() 
  

Данные

 data <- structure(list(yq = structure(c(2011, 2011, 2011.25, 2011.25, 
2011.5, 2011.5, 2011.75, 2011.75, 2012, 2012, 2012.25, 2012.25, 
2012.5, 2012.5, 2012.75, 2012.75, 2013, 2013, 2013.25, 2013.25
), class = "yearqtr"), flag = c(0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 
0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L, 0L, 1L), n = c(269L, 
172L, 266L, 121L, 239L, 131L, 153L, 76L, 260L, 131L, 284L, 136L, 
197L, 85L, 130L, 59L, 273L, 114L, 333L, 124L), ratio = c(0.61, 
0.39, 0.687, 0.313, 0.646, 0.354, 0.668, 0.332, 0.665, 0.335, 
0.676, 0.324, 0.699, 0.301, 0.688, 0.312, 0.705, 0.295, 0.729, 
0.271)), row.names = c(NA, -20L), class = c("tbl_df", "tbl", 
"data.frame"))
  

Ответ №2:

Я предполагаю, что вы используете пакет зоопарка, затем установите scale_x_yearqtr с пользовательскими разрывами:

 ggplot(data = data, aes(x = yq, y = ratio, fill = flag))  
  geom_bar(stat = "identity", color = "black", position = position_dodge()) 
  scale_x_yearqtr(breaks = unique(data$yq))  
  theme_minimal()  
  scale_fill_manual(values = c('#999999', '#E69F00'))
  

введите описание изображения здесь

Затем, если необходимо, просто переверните:

 ggplot(data = data, aes(x = yq, y = ratio, fill = flag))  
  geom_bar(stat = "identity", color = "black", position = position_dodge()) 
  scale_x_yearqtr(breaks = unique(data$yq))  
  theme_minimal()  
  scale_fill_manual(values = c('#999999', '#E69F00'))  
  coord_flip()
  

введите описание изображения здесь

Данные

 > dput(data)
structure(list(yq = structure(c(2011, 2011, 2011.25, 2011.25, 
2011.5, 2011.5, 2011.75, 2011.75, 2012, 2012, 2012.25, 2012.25, 
2012.5, 2012.5, 2012.75, 2012.75, 2013, 2013, 2013.25, 2013.25
), class = "yearqtr"), flag = structure(c(1L, 2L, 1L, 2L, 1L, 
2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L), .Label = c("0", 
"1"), class = "factor"), n = c(269L, 172L, 266L, 121L, 239L, 
131L, 153L, 76L, 260L, 131L, 284L, 136L, 197L, 85L, 130L, 59L, 
273L, 114L, 333L, 124L), ratio = c(0.61, 0.39, 0.687, 0.313, 
0.646, 0.354, 0.668, 0.332, 0.665, 0.335, 0.676, 0.324, 0.699, 
0.301, 0.688, 0.312, 0.705, 0.295, 0.729, 0.271)), row.names = c(NA, 
-20L), class = "data.frame")
  

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

1. Точно! Я использовал zoo пакет для генерации year/quarter . Спасибо, это решило проблему. не могли бы вы объяснить, что именно scale_x_yearqtr делаете? Раньше я видел scale_x_discrete или scale_x_continous , и эта функция для меня совершенно новая

2. @Roozbeh_you, руководство для scale_x_yearqtr довольно ясное, оно помогает при построении объектов зоопарка: «Удобные функции для построения объектов зоопарка с помощью ggplot2». Я просто устанавливаю пользовательские разрывы на основе уникальных значений квартала данных.

Ответ №3:

Может быть, попробуйте это:

 library(tidyverse)
#Code
df %>% 
  mutate(yq=factor(yq,levels = rev(unique(yq)),ordered = T)) %>%
  ggplot(aes(x=yq, y=ratio, fill=factor(flag)))  
  geom_bar(stat="identity", color="black", position=position_dodge()) 
  theme_minimal()  
  scale_x_discrete(breaks=unique(df$yq)) 
  scale_fill_manual(values=c('#999999','#E69F00')) 
  coord_flip() labs(fill='flag')
  

Вывод:

введите описание изображения здесь

Или это:

 #Code 2
df %>% 
  ggplot(aes(x=yq, y=ratio, fill=factor(flag)))  
  geom_bar(stat="identity", color="black", position=position_dodge()) 
  theme_minimal()  
  scale_x_discrete(breaks=unique(df$yq)) 
  scale_fill_manual(values=c('#999999','#E69F00')) 
  theme(axis.text.x = element_text(angle=90)) labs(fill='flag')
  

Вывод:

введите описание изображения здесь

Некоторые используемые данные:

 #Data
df <- structure(list(yq = c("2011 Q1", "2011 Q1", "2011 Q2", "2011 Q2", 
"2011 Q3", "2011 Q3", "2011 Q4", "2011 Q4", "2012 Q1", "2012 Q1", 
"2012 Q2", "2012 Q2", "2012 Q3", "2012 Q3", "2012 Q4", "2012 Q4", 
"2013 Q1", "2013 Q1", "2013 Q2", "2013 Q2"), flag = c(0, 1, 0, 
1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1), n = c(269, 
172, 266, 121, 239, 131, 153, 76, 260, 131, 284, 136, 197, 85, 
130, 59, 273, 114, 333, 124), ratio = c(0.61, 0.39, 0.687, 0.313, 
0.646, 0.354, 0.668, 0.332, 0.665, 0.335, 0.676, 0.324, 0.699, 
0.301, 0.688, 0.312, 0.705, 0.295, 0.729, 0.271)), row.names = c(NA, 
-20L), class = "data.frame")
  

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

1. Спасибо. Я предполагаю, что второй график — это то, что я ищу; однако, когда я попытался следовать вашему коду, я получил сообщение об ошибке, scale_x_discrete как и раньше. ошибка: Error: "mapped_discrete" objects can only be created from numeric vectors . Итак, я должен создать отдельный вектор yq и передать его функции для его разрешения?

2. Спасибо, Дак, я думаю, @zx8754 ответил на мой вопрос. Похоже, что сообщение об ошибке связано с типом данных, который является результатом zoo пакета. Я должен был предоставить, чтобы вы знали, с каким типом данных вы имеете дело. Урок усвоен!