#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)