堆叠 geom_bar 而不聚合填充值会导致轴值不正确

stacked geom_bar without aggregating the fill values results in incorrect axis values

我正在尝试创建一个不对填充值求和的堆叠条形图。例如,假设我有一个随着温度 (y) 升高而改变颜色的解决方案。我想要一个条形图,显示颜色随温度升高沿 y 轴上升。我基本上成功地做到了这一点,但是 y 轴刻度不正确

示例数据:

x<- data.frame(color = c("red", "blue", "red", "orange"), temperature = c(1, 5, 10, 20), trial = c(1, 1, 1, 1))
x
   color temperature trial
1    red           1     1
2   blue           5     1
3    red          10     1
4 orange          20     1

注意只有一次试炼,所以只有一次试炼才会有一根吧。另请注意,当温度达到 5 时,颜色从红色变为蓝色,然后当温度达到 10 时,颜色从蓝色变为红色。我希望条形图沿 y 轴以类似的方式改变颜色。当我绘制它时,y 轴刻度线是错误的:

[![#Convert to factors for plotting
x$temperature<- as.factor(x$temperature)
x$color<- as.factor(x$color)][1]][1]
#plot
library(ggplot2)
ggplot(x, aes(x = trial, y = temperature, fill = color))+
  geom_bar(position = "stack", stat = "identity")

请注意,在我的输出图像中,y 轴刻度与数据不对齐(请注意,条中的颜色与数据框中的“颜色”值不对应。发生了什么?

将值转换为因数后,记下数据水平。

levels(x$temperature) #This is correct
[1] "1"  "5"  "10" "20"

levels(x$color) #This is not correct
#[1] "blue"   "orange" "red"   

您需要 color 具有与它们出现的顺序相同的因子水平。一个简单的方法是使用 fct_inorder。您可以使用 scale_fill_identity 为条形分配与 color 列中相同的颜色。

library(tidyverse)

x %>%
  mutate(across(c(color, temperature), ~fct_inorder(as.character(.)))) %>% 
  ggplot(aes(x = trial, y = temperature, fill = color))+
  geom_bar(position = "stack", stat = "identity") + 
  scale_fill_identity()