如何在ggplot geom_bar中添加特定值的比例渐变?

w8biq8rn  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(85)

我想用ggplot2创建一个条形图,在这里我可以设置最小值,中间值和最大值(在我的例子中是:min = 0,mid = 50,max = 100)。对于每个值,我想关联一个比例梯度,其中0对应于蓝色,中间对应于黄色(或白色),100对应于红色。
我什么都没找到,你能帮我吗?
先谢谢你了。
下面是我尝试使用但不起作用的代码(我获得的条形图有灰色条)。

TPH <- ggplot(ser, aes(x= Stages, y= TPH))+
  geom_bar(stat = "identity")+
  scale_fill_gradient(low='blue', high='red')+
  labs(y= expression("Counts per million (CPM)"), x = "Hours post fertilization (hpf)")+
  ggtitle("Tryptophan Hydroxylase", subtitle = "TPH")+
  theme(plot.title=element_text(hjust=0.5),
        plot.subtitle=element_text(hjust=0.5))+
  scale_y_continuous(limits=c(0, 100))+
  scale_x_discrete(labels=c("hpf00" = "0", "hpf04" = "4", "hpf08" ="8", "hpf12"="12", "hpf16"="16", "hpf20"="20","hpf24"="24", "hpf28"="28", "hpf32"="32", "hpf36"="36","hpf40"="40", "hpf44"="44", "hpf48"="48", "hpf52"="52", "hpf72"="72"))
TPH

字符串

sr4lhrrt

sr4lhrrt1#

假设您的数据看起来像这样(请在接下来的问题中包含一些示例数据)

# libraries
library(tidyr)
library(dplyr)
library(ggplot2)

# set seed for reproducibility
set.seed(123) 

# get example data
ser <- data.frame(Stages = c("hpf00", "hpf04", "hpf08", "hpf12", "hpf16",
                                 "hpf20", "hpf24", "hpf28", "hpf32", "hpf36",
                                 "hpf40", "hpf44", "hpf48", "hpf52", "hpf72")) %>%
      mutate(TPH = sample(1:100, length(Stages)))

字符串
你可以在Stages的每个水平上生成一个从0到你的观察值的向量(按照这里提供的答案https://stackoverflow.com/a/71043558/15024678)。然后你可以解嵌套这些向量:

ser_mod <- ser %>%
  mutate(TPH = purrr::map(TPH, ~0:.x)) %>%
  unnest_longer(TPH)


这可以使用geom_tile()绘制,从而生成符合您描述的条形图。

ggplot(ser_mod, aes(x = Stages, y = TPH)) +
  geom_tile(aes(fill = TPH, width = .9)) +
  scale_fill_distiller(palette = "RdYlBu") +
  theme(legend.position = "none")


输出:

如果x轴上每个级别的最大值为100,则希望条形图完全为红色的修改方案

获取修改后的示例数据,使hpf 12的TPH = 100:

# set seed for reproducibility
set.seed(123) 

# get example data
ser <- data.frame(Stages = c("hpf00", "hpf04", "hpf08", "hpf12", "hpf16",
                             "hpf20", "hpf24", "hpf28", "hpf32", "hpf36",
                             "hpf40", "hpf44", "hpf48", "hpf52", "hpf72")) %>%
  mutate(TPH = sample(1:100, length(Stages))) %>%
  mutate(TPH = ifelse(Stages == "hpf12", 100, TPH))


在生成包含从0到每个TPH水平的观测值的值的列之后,您可以生成一个用于着色的新列(TPH_fill)。然后可以修改此列,以便如果TPH为100,则它仅包含100(导致红色):

ser_mod <- ser %>%
  mutate(TPH = purrr::map(TPH, ~0:.x)) %>%
  unnest_longer(TPH) %>%
  group_by(Stages) %>%
  mutate(TPH_fill = ifelse(max(TPH) == 100, 100, TPH)) %>%
  mutate(TPH_fill = ifelse(TPH_fill != 100, TPH, TPH_fill))


使用TPH_fill作为fill的参数绘图:

ggplot(ser_mod, aes(x = Stages, y = TPH)) +
  geom_tile(aes(fill = TPH_fill, width = .9)) +
  scale_fill_distiller(palette = "RdYlBu") +
  theme(legend.position = "none")


输出:

如果您不想让颜色渐变沿着y轴,而是让条形按其最大值着色,则修改解决方案

您可以根据未修改的数据绘制geom_col(),并通过TPH的值设置fill

ggplot(ser, aes(x = Stages, y = TPH)) +
  geom_col(aes(fill = TPH)) +
  scale_fill_distiller(palette = "RdYlBu") +
  theme(legend.position = "none")


输出:

相关问题