Как я могу использовать ggplot для создания нескольких участков в одной трубе

#r #ggplot2 #dplyr

Вопрос:

Поэтому я использовал ggplot для создания трех разных графиков, и они используют один и тот же фрейм данных. Все очень похоже на другое. Приведенные ниже коды работали довольно хорошо. Однако мне было неловко повторять их снова и снова. Могу ли я как-нибудь это немного упростить?

wday номер кошки cat_size cat_age
Понедельник какое-то число не важно какое-то число
Вт какое-то число не важно какое-то число
 smelly_cat %>%
  ggplot(aes(x=wday, y=cat_number))  
  geom_bar()
smelly_cat %>%
  ggplot(aes(x=wday,y=cat_size))  
  geom_bar()
smelly_cat %>%
  ggplot(aes(x=wday,y=cat_age))  
  geom_bar()
 

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

1. похоже, формат таблицы просто рухнул

2. Но идея в том, что wday и cat_size, cat_age, cat_number-это просто разные столбцы в фрейме данных

Ответ №1:

Используя iris в качестве примера здесь.

 library(ggplot2)
library(dplyr)
library(reshape2)

df <- iris %>%
  group_by(Species) %>%
  summarize(across(everything(), mean))
df <- melt(df, id.vars = "Species")
 

Я использую reshape2 melt() , чтобы получить эту таблицу:

       Species     variable value
1      setosa Sepal.Length 5.006
2  versicolor Sepal.Length 5.936
3   virginica Sepal.Length 6.588
4      setosa  Sepal.Width 3.428
5  versicolor  Sepal.Width 2.770
6   virginica  Sepal.Width 2.974
7      setosa Petal.Length 1.462
8  versicolor Petal.Length 4.260
9   virginica Petal.Length 5.552
10     setosa  Petal.Width 0.246
11 versicolor  Petal.Width 1.326
12  virginica  Petal.Width 2.026
 

Теперь все значения y находятся в одном столбце, и я могу их построить. Затем вы можете использовать fill в своем aes() для определения групповой переменной. Вот так:

 ggplot(df, aes(x=Species,y=value,fill=variable))  
  geom_bar(position = "dodge", stat = "identity")
 

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

В своем geom_bar() вы определяете позиционирование («сложено» для сложенных баров, «уклонение» для сгруппированных баров) и используете stat = "identity" , чтобы R не выполнял никаких агрегаций.

Если ваши значения y находятся в разных масштабах, вы, возможно, не захотите, чтобы они отображались на одном графике. Вы можете использовать facet_grid() их для разделения, это будет выглядеть так:

 ggplot(df, aes(x=Species,y=value))  
  geom_bar(stat = "identity")   facet_grid(. ~ variable)
 

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