如果我有這個情節,我想制作一個條形圖,
df <-
setNames(data.frame(
as.POSIXct(
c(
"2022-07-29 00:00:00",
"2022-07-29 00:00:05",
"2022-07-29 00:05:00",
"2022-07-29 00:05:05",
"2022-07-29 00:10:00",
"2022-07-29 00:15:00",
"2022-07-29 00:20:00",
"2022-07-29 00:20:05"
)),
c(1, 2, 3, 4, 5, 6, 7, 8),
c("a", "a", "b847", "b317", "b317", "bob680", "bf456", "c3400")
),
c("timeStamp", "value1", "text"))
df %>% ggplot(aes(x=fct_infreq(text), fill=text)) geom_bar(stat='count',aes(y=(..count..)/sum(..count..)))
怎么可能在“文本”中分配“a”,始終是某種顏色?訣竅是,我不能只創建一個調色板并使用
scale_fill_manual(values=palette).
這樣做的原因是因為“a”是“文本”中唯一始終顯示的數字,每次新資料進入時我都需要繪制它。我試圖用構成“文本”其余部分的隨機字符/數字字串來展示這一點。我希望始終將“a”顯示為特定顏色,即紅色,然后將所有其他傳入的 UNKNOWN(因此我不能使用手動調色板)變數分別分配任何隨機顏色。
此外,使情節始終顯示除“a”之外的文本中最常見的 5 個變數。我知道這可以使用類似的東西
'%!in%' <- Negate('%in%')
df$text[df$text %!in% c("b847", "b317", "b317", "bob680", "bf456", "c3400")] <- "a"
如您所見,這只有在我運行繪圖、手動識別前 5 個、然后更改基本資料框以將所有其他資料框簡單地分配為“a”之后才有可能。我認為必須有更好、更自動化的方法來做到這一點,因為這絕對是 geom_bar 圖表中的常見需求。但我似乎無法找到解決方案。
謝謝
uj5u.com熱心網友回復:
使用relevel()orforcats::fct_relevel()使“a”始終是第一級;然后提供一個未命名的手動調色板,其中紅色作為第一個值。
library(dplyr)
library(forcats)
library(ggplot2)
library(scales)
df %>%
mutate(
text = fct_infreq(text),
text_fill = fct_relevel(text, "a")
) %>%
ggplot(aes(x=text, fill=text_fill))
geom_bar(aes(y=(..count..)/sum(..count..)))
scale_fill_manual(values = c("red", brewer_pal(palette = "Set2")(8)))

請注意,我創建了一個單獨的列text_fill,如果該"a"列的值較少,它仍將出現在 x 軸上的正確位置。如果您不關心這一點并希望它始終首先出現,那么只需 relevel text。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/531116.html
上一篇:無法生成具有對數刻度的分組箱線圖
下一篇:為什么我沒有得到不同的對立柱?
