如何在ggplot2 geom_bar中对填充颜色进行排序

esyap4oy  于 2023-05-04  发布在  其他
关注(0)|答案(6)|浏览(254)

我调用ggplot函数

ggplot(data,aes(x,y,fill=category)+geom_bar(stat="identity")

结果是一个条形图,其中的条形由与类别对应的各种颜色填充。然而,颜色的顺序从条到条并不一致。说有粉红色,绿色和蓝色。有些条从下到上变成粉红色,绿色,蓝色,有些条变成绿色,粉红色,蓝色。我看不出有什么明显的规律。
这些排序是如何选择的?我怎么能改变它?至少,我如何才能让ggplot选择一个一致的排序?
(x,y和category)的类分别是(integer,numeric和factor)。如果我将category设置为有序因子,则不会更改此行为。
有谁知道怎么解决这个问题吗?
可重复的示例:

data <- data.frame(
  mon = c(
    9L, 10L, 11L, 10L, 8L, 7L, 7L, 11L, 9L, 10L, 12L, 11L, 7L,
    12L, 8L, 12L, 9L, 7L, 9L, 10L, 10L, 8L, 12L, 7L, 11L, 10L, 8L,
    7L, 11L, 12L, 12L, 9L, 9L, 7L, 7L, 12L, 12L, 9L, 9L, 8L
  ),
  gclass = ordered(c(
    "Up-Up", "Down-Down", "Up-Stable", "Stable-Up", "Stable-Down",
    "Stable-Down", "Down-Up", "Stable-Up", "Down-Stable", "Stable-Down",
    "Down-Down", "Down-Down", "Stable-Stable", "Up-Down", "Down-Down",
    "Stable-Up", "Up-Stable", "Stable-Up", "Stable-Down", "Up-Down",
    "Up-Stable", "Up-Down", "Up-Up", "Up-Stable", "Down-Up", "Stable-Stable",
    "Up-Up", "Down-Stable", "Up-Down", "Down-Up", "Stable-Stable",
    "Stable-Stable", "Up-Down", "Up-Down", "Up-Up", "Down-Stable",
    "Stable-Down", "Down-Down", "Down-Up", "Up-Stable"
  )),
  NG = c(
    222614.67, 9998.17, 351162.2, 37357.95, 4140.48, 1878.57, 553.86, 40012.25,
    766.52, 15733.36, 90676.2, 45000.29, 0, 375699.84, 2424.21, 93094.21,
    120547.69, 291.33, 1536.38, 167352.21, 160347.01, 26851.47, 725689.06,
    4500.55, 10644.54, 75132.98, 42676.41, 267.65, 392277.64, 33854.26, 384754.67,
    7195.93, 88974.2, 20665.79, 7185.69, 45059.64, 60576.96, 3564.53, 1262.39,
    9394.15
  )
)

ggplot(data, aes(mon, NG, fill = gclass)) + geom_bar(stat = "identity")
lc8prwob

lc8prwob1#

从ggplot2_2.0.0开始,order美学不再可用。要获得一个堆栈按填充颜色排序的图形,您可以简单地按要排序的分组变量对数据集进行排序。
我经常使用 dplyr 中的arrange。在这里,我在ggplot调用中按fill因子对数据集进行排序,而不是创建一个有序的数据集,但两者都可以正常工作。

library(dplyr)

ggplot(arrange(data, gclass), aes(mon, NG, fill = gclass)) +
    geom_bar(stat = "identity")

当然,这在base R中很容易做到,使用经典的order和提取括号:

ggplot(data[order(data$gclass), ], aes(mon, NG, fill = gclass)) +
    geom_bar(stat = "identity")

两种情况下的结果图现在都按所需顺序显示:

ggplot2_2.2.0更新

在ggplot_2.2.0中,填充顺序基于因子水平的顺序。默认顺序将在堆栈的 * 顶部 * 而不是底部绘制第一个级别。
如果你想在堆栈底部的第一层,你可以在position_stack中使用reverse = TRUE。注意,您也可以使用geom_col作为geom_bar(stat = "identity")的快捷方式。

ggplot(data, aes(mon, NG, fill = gclass)) +
    geom_col(position = position_stack(reverse = TRUE))
7cjasjjr

7cjasjjr2#

您还需要指定order外观。

ggplot(data,aes(mon,NG,fill=gclass,order=gclass))+
    geom_bar(stat="identity")

这可能是也可能不是bug

gv8xihay

gv8xihay3#

要订购,您必须使用levels参数并通知订单。就像这样:

data$gclass
(data$gclass2 <- factor(data$gclass,levels=sample(levels(data$gclass)))) # Look the difference in the factors order
ggplot(data,aes(mon,NG,fill=gclass2))+geom_bar(stat="identity")
taor4pac

taor4pac4#

您可以使用scale_fill_函数更改颜色。例如:

ggplot(dd,aes(mon,NG,fill=gclass)) + 
  geom_bar(stat="identity") + 
  scale_fill_brewer(palette="blues")

要在bars中获得一致的排序,则需要对 Dataframe 进行排序:

dd = dd[with(dd, order(gclass, -NG)), ]

要更改图例的顺序,请更改gclass因子。比如说

dd$gclass= factor(dd$gclass,levels=sort(levels(dd$gclass), TRUE))

ecfdbz9o

ecfdbz9o5#

由于此交换首先显示为“因子填充订单”,因此我将添加一个解决方案,我认为这是一个更直接的解决方案,并且不需要更改您的基础数据。

ggplot(data,aes(x,y,fill=factor(category, levels = c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", "Stable-Stable", "Stable-Down", "Up-Down", "Up-Stable", "Up-Up"))) + 
geom_col(position = position_stack(reverse = FALSE))

或者,我更喜欢的是,我首先创建一个变量向量,以简化稍后的编码并使其更易于编辑:

v_factor_levels <- c("Down-Down", "Down-Stable", "Down-Up", "Stable-Down", "Stable-Stable", "Stable-Down", "Up-Down", "Up-Stable", "Up-Up")

ggplot(data,aes(x,y,fill=factor(category, levels = v_factor_levels)) + 
geom_col(position = position_stack(reverse = FALSE))

在geom_col()中不需要reverse position元素,我保留了这些元素作为提醒,以防我想反转,但您可以通过消除它来进一步简化。

w1jd8yoj

w1jd8yoj6#

基于@aosmith的答案,我发现另一种订购酒吧的方法稍微更直观一些:

ggplot(data, aes(x=mon, y=reorder(NG,gclass), fill = gclass)) +
    geom_bar(stat = "identity")

base stats包中的reorder函数的妙处在于,你可以在reorder(based_on_dimension, y, function)中应用它,其中y是用sum、mean等函数根据based_on_dimension排序的。

相关问题