ggplot2与colorbrewer的质量调色板中有125个类别。

6
我有以下数据:
  • 10个州
  • 每个州有两种类型
  • 每种类型都有1到29个实体
  • 每个状态-实体-类型都有一个计数

完整的数据在此处

我试图可视化每个实体的计数比例。为此,我使用了以下代码:

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 制作一个漂亮的分散方案调色板并不容易(这可能是一个好答案,眨眨眼)。需要对每个州类型的实体运行颜色酿造器(本身就有问题,因为大多数调色板似乎只能处理不超过12个),然后将其放在正确的顺序中。 - Ari B. Friedman
2
很难想出29种不同的颜色,为什么不直接用文本标签来标识实体呢? - hadley
@hadley 已记录。文本最好,但可能会变得混乱无序。我想我的要求实际上更简单:颜色甚至不必在状态类型内唯一,只需交替出现即可。我可以尝试使用 scale_fill_manual( values=c(rep(c('red','blue'),125/2),'red') ) 这样的东西,但它们不能保证在每个条形图内部交替出现。 - Ari B. Friedman
你可以使用 alternate <- function(x) factor(match(x, unique(x)) %% 2) 来创建一个新变量,并且在 ave 中应用于分组:ave(entity, state, FUN = alternate)(未经测试)。 - hadley
1个回答

6
这里有一种方法可以给您更多的信息。使用rainbow生成的色轮,将每个其他颜色与轮子上相反的颜色进行交换。
col <- rainbow(30)
col.index <- ifelse(seq(col) %% 2, 
                    seq(col), 
                    (seq(ceiling(length(col)/2), length.out=length(col)) %% length(col)) + 1)
mixed <- col[col.index]

p <- ggplot(icc, aes(x=state, y=count, fill=entity)) +
  geom_bar(stat="identity", position="stack") +
  facet_grid( type ~ . ) + 
  scale_fill_manual(values=rep(mixed, length.out=nrow(icc)))

custom_theme <- theme_update(legend.position='none')
p

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接