Я пытаюсь использовать ggplot
для построения частотного графика, где пропущенные значения все еще отображаются в легенде. Мне удалось добиться этого, установив drop = FALSE
в scale_fill_manual
, однако в легенде переброшенное поле не имеет цвета, хотя я его явно установил. Я создал пример, аналогичный моим данным ниже. В этом примере я ищу Мале для отображения в легенде с цветом, установленным в scale_fill_manual
, но не могу понять, как это сделать.
Data_Sample <- data.frame(CatType = c(rep("C1",3), rep("C2",7), rep("C3",8), rep("C4", 9), rep("C5", 2), rep("C6", 1)),
Owner = c("Angela", "Karen", "Angela")) %>%
mutate(Sex = ifelse(str_detect(CatType,"6"), "Male", "Female"),
CatID = str_pad(row_number(), 2, pad = "0"),
Sex = factor(Sex, c("Male" = "Male", "Female" = "Female")),
Owner = factor(Owner, c("Angela" = "Angela", "Karen" = "Karen")),
CatType = factor(CatType))
Sample_Plot <- ggplot(Data_Sample %>% filter(., Owner == "Karen"), aes(x = CatType)) +
geom_bar(colour = "#2E312F",aes(y = 100*((..count..)/sum(..count..)), fill = Sex)) +
scale_x_discrete(drop = FALSE) +
geom_text(aes(label = paste(stat(100*round((..count..)/sum(..count..),5)), "%", sep = ""), x = CatType, y = stat(100*round((..count..)/sum(..count..),5))), stat = "count", colour = "#2E312F",size = 3.5, fontface = "bold", vjust = -0.25) +
theme(axis.text.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold", size=11),
axis.text.y = element_text(face = "bold"),
axis.title.x = element_text(face = "bold", size=11),
legend.title = element_text(face = "bold", size=11),
legend.text = element_text(face = "bold", size=7.5),
plot.title = element_text(face = "bold", size=14, hjust = 0.5),
legend.title.align = 0.5,
legend.text.align = 0,
legend.box.background = element_rect(colour = "black", fill = "transparent", size = 1.5),
strip.text = element_text(face = "bold", size=14),
panel.border = element_rect(colour = "black", fill=NA, linewidth = 2)
) +
scale_fill_manual(values = c("Female" = "#c90076", "Male" = "#2986cc"), drop = FALSE) +
guides(fill = guide_legend(reverse=TRUE)) +
labs(x = "Cat Type", y = "Percentage of Cats", title = paste("Karen's Cats", sep = " ")) +
scale_y_continuous(label=scales::label_percent(scale = 1), limits = c(0,100))
Это связано с изменением, внесенным в ggplot2 3.5.0
, которое теперь требует явного добавления show.legend=TRUE
к geom
, чтобы отобразить ключ легенды для неиспользуемых уровней фактора. Также обратите внимание, что я перешел на after_stat
, поскольку ..
и stat
устарели с версии 3.4.0
, и используйте hjust
для выравнивания текста легенды и заголовка, поскольку legend.xxx.align
устарела в 3.5.0
.
library(ggplot2)
library(dplyr, warn = FALSE)
ggplot(Data_Sample %>% filter(., Owner == "Karen"), aes(x = CatType)) +
geom_bar(colour = "#2E312F", aes(
y = 100 * after_stat(count / sum(count)),
fill = Sex
), show.legend = TRUE) +
scale_x_discrete(drop = FALSE) +
geom_text(
aes(
label = paste0(round(100 * after_stat(count / sum(count))), "%"),
x = CatType,
y = 100 * after_stat(count / sum(count))
),
stat = "count", colour = "#2E312F",
size = 3.5, fontface = "bold", vjust = -0.25
) +
theme(
axis.text.x = element_text(face = "bold"),
axis.title.y = element_text(face = "bold", size = 11),
axis.text.y = element_text(face = "bold"),
axis.title.x = element_text(face = "bold", size = 11),
legend.title = element_text(face = "bold", size = 11, hjust = .5),
legend.text = element_text(face = "bold", size = 7.5, hjust = 0),
plot.title = element_text(face = "bold", size = 14, hjust = 0.5),
legend.box.background = element_rect(
colour = "black",
fill = "transparent", linewidth = 1.5
),
strip.text = element_text(face = "bold", size = 14),
panel.border = element_rect(colour = "black", fill = NA, linewidth = 2)
) +
scale_fill_manual(values = c("Female" = "#c90076", "Male" = "#2986cc"), drop = FALSE) +
guides(fill = guide_legend(reverse = TRUE)) +
labs(x = "Cat Type", y = "Percentage of Cats", title = paste("Karen's Cats", sep = " ")) +
scale_y_continuous(label = scales::label_percent(scale = 1), limits = c(0, 100))
Оу. Извини. Кроме того, я забыл умножить положение метки y
на 100. Только что внес изменения, чтобы исправить обе проблемы.
и тут я ходил кругами, потому что старый код не работал....
Спасибо за ответ. Это сработало, и спасибо за помощь с другими устаревшими вещами! Единственное, что касается вашего
after_stat
, похоже, в нем нет правильных круглых скобок, поскольку текст находится в неправильном месте и связаны неправильные проценты.