Легенда, смешивающая формы с geom_points R
Моя легенда отображается некорректно, когда я делаю свой график в R с помощью ggplot2. Один столбец моего набора данных представлен geom_bar, а два других представлены geom_points (по одной форме каждый). Круг и ромбовидная форма показаны как для 2000, так и для 2008 года, причем круг находится в диаметре для обоих лет. Однако график работает совершенно нормально...
Вот скриншот:
Я создал упрощенную версию своего набора данных:
order_var <- c(1, 4, 3, 5, 6, 2)
alt_name <- c('Agriculture', 'Mining', 'Food products',' Manufacture', 'Chemicals', 'Machinery')
y2000 <- c(20, 40, 50, 80, 30, 70)
y2008 <- c(40, 50, 80, 70, 30, 60)
y2018 <- c(10, 30, 80, 50, 40, 50)
datatest <- data.frame("order_var" = order_var, "alt_name" = alt_name, "y2000" = y2000, "y2008" = y2008, "y2018" = y2018)
И код для моего графика:
datatest %>% ggplot(aes(x = reorder(alt_name, order_var))) +
geom_bar(stat = "identity", aes(y = `y2018`, fill = "2018"), width = 0.7, col = "black") +
geom_point(aes(y = `y2008`, col = "2008"), shape = 23, fill = "white", size = 5) +
geom_point(aes(y = `y2000`, col = "2000"), shape = 19, fill = "black", size = 3) +
xlab("Industry") +
ylab("Percentage") +
theme(legend.position = "top") +
scale_fill_manual(name = '', values = c("2018" = "#4F81BD"), breaks = c("2018")) +
scale_colour_manual(name = '', values = c("2008" = "black", "2000" = "orange"))
Если знаете как исправить эту проблему, буду очень признателен!!
Спасибо:)
1 ответ
Это очень сложный сюжет, который вы пытаетесь создать, потому что вы, по сути, сопоставляете одну и ту же эстетику с разными
geom
с.
Первое, что вам нужно сделать, это преобразовать данные в длинный формат. Я также разделил ваш набор данных между 2018 годом (полоса) и 2000, 2008 (точки).
df2 <- datatest %>%
pivot_longer(cols = -c(order_var, alt_name)) %>%
mutate(bar = if_else(name == "y2018", 1, 0))
data_bar <- df2 %>% filter(bar == 1)
data_point <- df2 %>% filter(bar != 1)
Я также считаю полезным добавить к вашим точкам уклонение, чтобы они не перекрывали друг друга, как в случае химикатов с
position = position_dodge(width = 0.6)
.
Первое решение дает то, что вы хотите, но это своего рода взлом, и я бы не рекомендовал делать это в качестве общей стратегии. По сути, вы добавляете эстетику, которую не собираетесь использовать для стержней (в данном случае
linetype
), а затем переопределите его, как предлагается в этом ответе.
ggplot(data_bar, aes(x = reorder(alt_name, order_var))) +
geom_bar(aes(y = value, linetype = name), fill = "#4F81BD", stat = 'identity', color = 'black') +
geom_point(data = data_point, position=position_dodge(width=0.6), aes(y = value, color = name, shape = name, size = name, fill = name)) +
scale_colour_manual(values = c("orange", "black"), labels = c("2000", "2008")) +
scale_fill_manual(values = c("orange", "white"), labels = c("2000", "2008")) +
scale_shape_manual(values = c(19, 23), labels = c("2000", "2008")) +
scale_size_manual(values = c(3, 5), labels = c("2000", "2008")) +
scale_linetype_manual(values = 1, guide = guide_legend(override.aes = list(fill = c("#4F81BD"))), labels = c("2018")) +
theme(legend.position = "top", legend.title = element_blank()) +
labs(x = "Industry", y = "Percentage")
Другое решение, более общее, - избегать использования
fill
эстетика для
geom_point
и вместо этого изменив форму на твердую:
ggplot(data_bar, aes(x = reorder(alt_name, order_var))) +
geom_bar(aes(y = value, fill = name), stat = 'identity', color = "black") +
geom_point(data = data_point, position=position_dodge(width=0.6), aes(y = value, color = name, shape = name, size = name)) +
scale_fill_manual(values = c("#4F81BD"), labels = c("2018")) +
scale_colour_manual(values = c("orange", "white"), labels = c("2000", "2008")) +
scale_shape_manual(values = c(19, 18), labels = c("2000", "2008")) +
scale_size_manual(values = c(4, 6), labels = c("2000", "2008")) +
theme(legend.position = "top", legend.title = element_blank()) +
labs(x = "Industry", y = "Percentage")