R ggplot2中有序堆积条形图的自定义x标签

Custom x-label for ordered stacked bar graph in R ggplot2

我正在尝试为 ggplot2 中的有序堆叠条形图创建自定义标签。

我的花园里有六种不同的动物 - 海狸、大象、袋鼠、老鼠、龙和吉娃娃。

我请他们每人唱两次给我听,一次是在他们高兴的时候,一次是在他们悲伤的时候。我记录了他们每次唱歌的时间。

我想在堆叠条形图中绘制动物的总歌唱时间,一个堆叠条对应一只动物,堆叠条的每个组件对应动物的心情,但我想订购堆叠按动物的大小显示栏,栏下方显示动物的名称。

为了尝试这样做,我在我的数据框中创建了一个列,将大小顺序信息与动物因素(例如“1.mouse”等)结合在一起。这允许条形图按大小顺序显示。然后我尝试使用“substring”来提取与 x 标签的名称相对应的字母(这样它就可以读取 "mouse" 等),但没有用。

如果我只使用“动物”来标记轴,那么 ggplot 会用按字母顺序列出的动物名称来标记条形。我也尝试过使用“订单”功能。

我查看了堆栈溢出和其他站点,但在其他地方找不到确切的问题。

非常感谢我和我的动物园!

animal<-rep(c("beaver","elephant","kangaroo","mouse","dragon","chihuahua"),2)
size_order<-rep(c(3,5,4,1,6,2),2)
mood<-c((rep("happy",6)),rep("sad",6))
singing_time<-as.numeric(rnorm(12, 5, 2))
ordered_animal<-paste(size_order,animal,sep = ".")

singing_data<-as.data.frame(cbind(mood,singing_time,ordered_animal))

ggplot(singing_data, aes(x = ordered_animal, y = singing_time, fill = mood, label = singing_time)) +
  geom_bar(stat = "identity") +
  scale_x_discrete(labels = levels(substring(as.factor(ordered_animal),3,10)))

部分问题是您对 cbind 的使用将不同的数据类型(数字、因子)强制转换为单一数据类型(数字)的矩阵。尝试使用带有矢量参数的 data.frame 构造函数。

您不需要将数字放入因子水平,也不需要 "ordered factor"(这对回归和其他建模很有用,但此处不需要)。只需使用带有 levels= 的常规因子即可处理显示顺序。

您的另一个问题是您的动物尺寸顺序不正确,因此示例结果看起来不正确。

animal_items <- c("beaver","elephant","kangaroo","mouse","dragon","chihuahua")
corrected_size_order<-c(4,6,1,3,2,5) # applies to animal_items

animal<-rep(animal_items,2)
ordered_animal <- factor(animal, levels=animal[corrected_size_order])

mood<-c((rep("happy",6)),rep("sad",6))
singing_time<-as.numeric(rnorm(12, 5, 2))

singing_data<-data.frame(mood,singing_time,ordered_animal)

ggplot(singing_data, aes(x = ordered_animal, y = singing_time, fill = mood, label = singing_time)) +
  geom_bar(stat = "identity")