簡體   English   中英

如何基於多列創建因子以進行繪圖

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM