【发布时间】:2013-01-24 09:47:15
【问题描述】:
我的数据如下:
- 10 个州
- 每个状态有两种类型
- 每种类型都有 1 到 29 个实体
- 每个状态实体类型都有一个计数
完整数据available as a gist。
我试图想象每个实体的计数比例。为此,我使用了以下代码:
icc <- transform( icc, state=factor(state), entity=factor(entity), type=factor(type) )
p <- ggplot( icc, aes( x=state, y=count, fill=entity ) ) +
geom_bar( stat="identity", position="stack" ) +
facet_grid( type ~ . )
custom_theme <- theme_update(legend.position="none")
p
不幸的是,我丢失了很多信息,因为具有大量实体的状态类型没有显示足够的独特颜色。
如上所述,我有 125 个实体,但状态类型中的实体最多为 29 个。有没有办法强制 ggplot2 和 colorbrewer 在每个实体类型中分配唯一(并且希望相当不同)颜色?
到目前为止,我想出的唯一方法是将entity 强制转换为一个整数,这可行,但不会在级别之间提供太多颜色差异。
【问题讨论】:
-
@Arun 制作这样一个具有良好分歧方案的调色板并非易事(可能是一个很好的答案,眨眼)。需要在每个状态类型的实体上运行颜色 brewer(这本身就有问题,因为似乎大多数调色板都超过了 12 个),然后按正确的顺序放置。
-
很难想出 29 种不同的颜色。为什么不直接用文本标记实体?
-
@hadley 注意到。文本会很棒,但最终可能会变得一团糟。我想我的要求实际上要简单得多:颜色甚至不必在状态类型中是唯一的,只需交替即可。我可以尝试
scale_fill_manual( values=c(rep(c('red','blue'),125/2),'red') )之类的方法,但不能保证它们在每个小节中交替出现。 -
您可以使用
alternate <- function(x) factor(match(x, unique(x)) %% 2))创建一个新变量,并使用ave在组中应用它:ave(entity, state, FUN = alternate)(未经测试)
标签: r ggplot2 colorbrewer