【问题标题】:Different fill orders in geom_bar per discrete x-valuegeom_bar 中每个离散 x 值的不同填充订单
【发布时间】:2018-02-22 09:17:59
【问题描述】:

我有这个ggplot:

我想要做的是在每个不同的cat1-category 中以share 的降序更改cat2 的顺序:

  • 对于 cat1 == Z:i 将首先出现,因为它在 cat1 中的份额最大,其次是 k,然后是 j 等等。
  • 对于 cat1 == Y:j 将首先出现,因为它在 cat1 中的份额最大,其次是 hkfg
  • 以此类推,适用于所有 cat1 类别。

我知道我可以通过定义因子水平来控制顺序,但由于我需要在不同的 cat1-categories 中使用不同的顺序,我不知道该怎么做。

谁能启发我?


df <- structure(list(cat2 = c("i", "k", "j", "h", "g", "j", "h", "k", 
"f", "g", "j", "h", "k", "f", "g", "i", "k", "j", "h", "f"), 
    cat1 = c("Z", "Z", "Z", "Z", "Z", "Y", "Y", "Y", "Y", "Y", 
    "X", "X", "X", "X", "X", "W", "W", "W", "W", "W"), share = c(0.254318086442458, 
    0.217254586570476, 0.13303361614456, 0.107317457057957, 0.0796390207719751, 
    0.255762968963295, 0.198921069216629, 0.177295815678624, 
    0.100770340584133, 0.0971042138291394, 0.222007778896866, 
    0.177174367182501, 0.156891912894117, 0.097677432116308, 
    0.0975337223454565, 0.503295513011454, 0.154491050393999, 
    0.114284166914891, 0.0802892036069214, 0.0549053589320047
    ), pos = c(0.477447245936265, 0.108627293285238, 0.283771394642756, 
    0.658265017686473, 0.751743256601439, 0.305177300160272, 
    0.532519319250233, 0.088647907839312, 0.779469237979754, 
    0.680531960773118, 0.26789580234255, 0.467486875382234, 0.0784459564470585, 
    0.702446497377094, 0.604840920146212, 0.520422973814617, 
    0.0772455251969995, 0.211633133851444, 0.812215332123805, 
    0.879812613393268)), .Names = c("cat2", "cat1", "share", 
"pos"), class = "data.frame", row.names = c(NA, -20L))

library(ggplot2)
ggplot(df, aes(cat1, share)) + 
  geom_bar(stat = "identity", aes(fill = cat2)) + 
  geom_text(aes(label = cat2, y = pos)) +
  coord_flip()

注意:我目前的想法是,也许它可以使用一个新类别来完成,其级别设置为 1st、2nd、3rd、4th、5th,但如果我使用它来填充,不同的 cat2 值,例如 i对于 Zj 对于 Y 将具有相同的填充颜色,因为它们在我不想要的相应 cat1 类别中排名第一。

【问题讨论】:

标签: r ggplot2


【解决方案1】:

您可以通过创建一个新的因子列来做到这一点,我们称之为cat3,基于cat1cat2。根据cat1share 设置该列的因子排序。然后使用这个新的cat3 因子列作为group 美学来设置条形的堆叠顺序。

在下面的代码中,arrange 设置了排序。我们在cat1 的每个级别内分别按share 对数据框进行排序。现在数据框按我们想要的顺序排列。然后我们通过将cat1cat2 粘贴在一起来创建cat3,并将级别的顺序设置为数据框的当前排序顺序。最后,在ggplot 中,我们使用cat3 作为group 美学来设置geom_bar 中的堆叠顺序。

另一个补充是使用position_stack(vjust=0.5) 来设置标签位置,而不是y 美学。

library(tidyverse)

df %>% 
  arrange(cat1, share) %>% 
  mutate(cat3 = factor(paste(cat1, cat2), levels=paste(cat1, cat2))) %>%
  ggplot(aes(cat1, share, group=cat3)) + 
    geom_bar(stat = "identity", aes(fill = cat2)) + 
    geom_text(aes(label = cat2), position=position_stack(vjust=0.5)) +
    coord_flip()

【讨论】:

  • 完美,谢谢! (也用于介绍position_stack
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多