【问题标题】:Plotting probability on horizontal greyscale graph from single variable从单个变量绘制水平灰度图的概率
【发布时间】:2026-01-17 21:40:02
【问题描述】:

我想创建如下水平堆栈图

Arr1、Arr2、Arr3、Arr4 在 0-1 范围内,长度约为 50000。

长度为 10 的简短示例:

Array 1 2 3 4 5 6 7 8 9 10
Arr1 0.1 0.1 0.1 0.2 0.2 0.2 0.7 0.7 0.4 0.7
Arr2 0.6 0.6 0.6 0.1 0.1 0.1 0.1 0.1 0.5 0.1
Arr3 0.3 0.3 0.3 0.7 0.7 0.7 0.2 0.2 0.1 0.2
Arr4 0.4 0.6 0.7 0.2 0.1 0.3 0.4 0.5 0.3 0.9
B a a a b b b a a a b

如何根据水平图中的值(或灰度值,每个值是不同的灰色阴影)从浅到深绘制每个 Arr1、Arr2、Arr3、Arr4。

接近 0 的值会使颜色变浅,接近 1 的值会变暗。使用灰度时,0 为白色,1 为黑色。

在图片Arr1中:低值是浅黄色,高值是深黄色(所有值都在0到1之间)

最后一个栏不同,Array: Bab 的列表,我如何为ab 的每次出现绘制不同的颜色。

在 B 的图片中:a 的出现将被着色为 greenb 的出现将被着色为pink

我不会太担心外框的布局,我会使用ggarrange 将所有图形放在一个图中

我为Array B尝试了什么

B=c(rep("a",1000),rep("b",1000),rep("a",1000))

df=data.frame(B)
df$ID <- seq.int(nrow(df))
df$char=as.numeric(factor(B))

ggplot(df, aes(x=ID,y = char, color = cut(char, breaks = c(0, 1, 2))))+geom_col()+coord_cartesian(ylim=c(0,1))+
  scale_colour_manual(values = c('red','green'),limits=c('(0,1]', '(1,2]'))+
  guides(color = guide_legend(title = 'letter'))

但传说并不完美

数组B 很重要,我无法获得正确或正确的 x 轴比例

  melt(id.vars = "Array") %>%
  mutate(variable = str_extract(variable, "[0-9]+")) %>%
  mutate(value = case_when(
    value == "a" ~ -1,
    value == "b" ~ 2, 
    TRUE ~ as.numeric(value)
  )) %>%
  mutate(zz = 1) %>%
  ggplot(aes(x = Array, y = variable, group = Array, fill = value)) +
  geom_col() + coord_flip()

我猜variable 设置不正确

【问题讨论】:

    标签: r ggplot2


    【解决方案1】:

    首先,您的样本数据包括Array等,您可以尝试

    df %>% 
      melt(id.vars = "Array") %>%
      mutate(variable = str_extract(variable, "[0-9]+")) %>%
      mutate(value = case_when(
        value == "a" ~ -1,
        value == "b" ~ 2, 
        TRUE ~ as.numeric(value)
      )) %>%
      mutate(zz = 1) %>%
      ggplot(aes(x = Array, y = variable, group = Array, fill = value)) +
      geom_col() + coord_flip()
    

    其次,您最好使用fill 而不是color,这就是您的传说看起来很奇怪的原因。此外,当您使用fill 时,这次您应该使用scale_fill_manual。例如,

    ggplot(df, aes(x=ID,y = char, fill = cut(char, breaks = c(0, 1, 2))))+geom_col()+
      coord_cartesian(ylim=c(0,1))+
      scale_fill_manual(values = c('red','green'),limits=c('(0,1]', '(1,2]'))+
      guides(color = guide_legend(title = 'letter'))
    

    #你可以试试

    library(RColorBrewer)
    df2 <- df %>% 
      melt(id.vars = "Array") %>%
      mutate(variable = str_extract(variable, "[0-9]+"))  %>%
      filter(value %in% c("a","b")) %>%
      mutate(col = value)
    
    df3 <- df %>% 
      melt(id.vars = "Array") %>%
      mutate(variable = str_extract(variable, "[0-9]+"))  %>%
      filter(!value %in% c("a","b")) %>%
      mutate(col = cut(as.numeric(value), 6))
    
    plot.df <- rbind(df2, df3)  
    yourScale <- c(brewer.pal(6, "Greys"), "green", "pink")
    plot.df %>%
      mutate(variable = as.numeric(variable)) %>%
      ggplot(aes(x = Array, y = variable, group = Array, fill = col)) +
      geom_col() + coord_flip() +
      scale_colour_manual("col", values = yourScale)
    

    【讨论】:

    • 如何为Array: B 获得不同的图例以对应颜色的字母?如果它是不同的图表,那很好。 x 轴看起来也不同
    • @RahilVora 我忘记将variable 更改为数字。它会使 x 轴看起来一样。我给你B的图例后再回复。
    • @RahilVora 我添加了一个新代码,但我认为这不太可能是您想要的。连续和离散混合色标非常困难。
    • 嗨@Park,即使将变量转换为数字后,x 轴仍然混乱。正如您所见,蓝色阴影中的 B 变量对于相同数量的 a 和 b(3'a' 和 3'b')具有不同的大小。我可以使用单个 df 处理第一个代码