![](/img/trans.png)
[英]R - How to create multiple datasets based on levels of factor in multiple columns?
[英]How to create a factor based on multiple columns for plotting
我想創建一個包含兩個類別 a 和 b 的條形圖,其中列的顏色取決於類別。 對於他們兩個,我都有字符串x
來確定類別順序。 x
中的值可以出現在兩個類別中。 現在我想找到一種方法來 plot 基於兩件事的列:首先x
的所有元素在其詞匯順序中屬於類別“a”,然后對於屬於類別 b 的元素也是如此。 理想情況下,不要沿着str_c(x, y)
的行創建人工 x 列,因為它們已經由圖例編碼。 此外,刻面不是一種選擇,因為這已經為另一列完成了。
我找到了一個解決方案,可以用我想要的標簽明確地覆蓋 x-labels,但我希望看到一種不那么 hacky 且可能容易出錯的方式!
library(tidyverse)
set.seed(1)
df <-
tibble(
x = c('1', '0', '0', '1'),
y = c('a', 'a', 'b', 'b'),
z = runif(4)
)
df %>%
arrange(y, x) %>%
mutate(ordering = str_c(y, '_', x)) %>%
{
ggplot(., aes(ordering, z, fill = y)) +
geom_col() +
scale_x_discrete(labels = pull(., x))
}
你可以做
df %>%
arrange(y, x) %>%
ggplot(aes(interaction(x, y), z, fill = y)) +
geom_col() +
scale_x_discrete(labels = parse_number)
labels
也可以采用 function 而不僅僅是字符向量。 因此,在這里我傳遞parse_number
,它將輸入解析為數字,從而刪除任何字符。 您可以使用interaction
而不是創建新的列ordering
。
如果您使用的不是數字而是其他東西,您可以使用以下方法提取原始 x 值
my_df %>%
arrange(y, x) %>%
ggplot(aes(interaction(x, y, sep = "_"), z, fill = y)) +
geom_col() +
scale_x_discrete("x-axis",
labels = function(x) str_remove(x, "_.*$"))
interaction
中默認的sep
是一個點,可以用\\.
在str_remove
function 中,但您也可以指定任何其他字符,這不是標簽的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.