Данные, которые вы предоставили, когда они помещены в таблицу, не являются «аккуратными». Вы можете узнать больше о аккуратных данных здесь .
Вот что я сделал, чтобы получить желаемый результат, предполагая, что вы начинаете с таких данных, как df
:
smoking <- c(21, 23.4, 83)
drinking <- c(19.5, 28.9, 57)
States <- c("CA", "NH", "NJ")
# the 'messy' data
df <- data.frame("States" = States,
"Smoking" = smoking,
"Drinking" = drinking)
> df
States Smoking Drinking
1 CA 21.0 19.5
2 NH 23.4 28.9
3 NJ 83.0 57.0
Когда затем можно использовать пакет tidyr
, чтобы преобразовать его в длинный формат. С этим намного проще работать в ggplot2
.
library(tidyr)
df_tidy <- pivot_longer(df, -States, names_to = "Type")
> df_tidy
# A tibble: 6 x 3
States Type value
<chr> <chr> <dbl>
1 CA Smoking 21
2 CA Drinking 19.5
3 NH Smoking 23.4
4 NH Drinking 28.9
5 NJ Smoking 83
6 NJ Drinking 57
Наконец, мы можем построить это, используя ggplot2
:
library(ggplot2)
ggplot(df_tidy, aes(x = States, y = value)) +
geom_bar(aes(fill = Type), position = "dodge", stat = "identity")
Мы также можем просто использовать geom_col()
вместо geom_bar()
, который использует stat = "identity"
по умолчанию, как мы узнаем из этой tidyverse
страницы справки.
ggplot(df_tidy, aes(x = States, y = value)) +
geom_col(aes(fill = Type), position = "dodge")
В любом случае мы получаем:
введите описание изображения здесь