我的 df 有兩個數值變數(正值和負值)和 2 個分類變數。因為我想繪制具有相同顏色形狀/邊界的負條,所以我在資料框中手動指定顏色并使用適當的代碼。我的問題是如何避免提前指定顏色并讓 R 使用隨機顏色但保留負條內的空白?
df <- data.frame(model = c("A","B","C","D","B","C"),
category = c("origin", "origin","origin","abroad","abroad","abroad"),
pos = c(40,50,45,100,105,80),
neg = c(-10,-5,-4,-16,-7,-2),
Colour = c("chocolate","deeppink4","yellow","steelblue3","deeppink4","yellow"))
Colour <- as.character(df$Colour)
Colour <- c(Colour,"white")
names(Colour) <- c(as.character(df$model),"white")
df <- df %>% pivot_longer(., cols=c('pos','neg'),
names_to = 'sign') %>%
mutate(Groups = paste(category, model),
sign = factor(sign, levels = c("neg", "pos")))
bar2 <- ggplot(df, aes(value, tidytext::reorder_within(model, value, category),
fill = ifelse(sign == "neg", "white", model),
color = model))
geom_col(position = "stacked")
scale_fill_manual(values = Colour, breaks = df$model)
scale_color_manual(values = Colour, breaks = df$model)
tidytext::scale_y_reordered()
labs(fill = "model")
facet_grid(category ~ ., switch = "y",scales = "free_y")
theme(axis.text.x = element_text(angle = 90),
strip.background = element_rect(fill = "white"),
strip.placement = "outside",
strip.text.y.left = element_text(angle = 0),
panel.spacing = unit(0, "lines")) theme(legend.position="none")
labs( title = "BarPlot",
subtitle = "changes",
y = " ")
bar2

uj5u.com熱心網友回復:
將正條和負條繪制為單獨的層:
ggplot()
# plot positive with fill and colour based on model
geom_col(aes(value, tidytext::reorder_within(model, value, category),
fill = model, color = model),
data = df[df$sign == "pos", ],
position = "stack")
# plot negative with colour from based on model, but fill fixed as "white"
geom_col(aes(value, tidytext::reorder_within(model, value, category),
color = model),
data = df[df$sign == "neg", ],
fill = "white",
position = "stack")
# the rest is same as OP's code
tidytext::scale_y_reordered()
labs(fill = "model")
facet_grid(category ~ ., switch = "y",scales = "free_y")
theme(axis.text.x = element_text(angle = 90),
strip.background = element_rect(fill = "white"),
strip.placement = "outside",
strip.text.y.left = element_text(angle = 0),
panel.spacing = unit(0, "lines"))
theme(legend.position="none")
labs( title = "BarPlot",
subtitle = "changes",
y = " ")

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/477213.html
