2017-05-22 77 views
2

这里是我的玩具例子:简化ggplot条形图,使酒吧的宽度相同

yvalue = c(.1, .2, .3, .2, .1, .2, .3, .1) 
df = data.frame(yvalue) 
df$name = c("a", "b", "c", "d", "e", "f", "g", "h") 
df$type = c("apple", "apple", "apple", "apple", "apple", "banana", "banana", "banana") 
ggplot(data = df) + geom_bar(aes(y = yvalue, x=type, fill=name), stat = "identity", position = position_dodge()) 

这里是结果图表: enter image description here

这样的安排基本上是我想要的,但我喜欢做的三件事情在这里,我不知道该怎么做:

  1. 使所有的酒吧同色
  2. REM奥雅纳传说
  3. 使所有的杆相同的宽度

谢谢!从定义中删除fill

+1

你到底想要达到什么目的?你想用你的阴谋回答什么问题?我认为这会更有助于理解你想对你的情节说什么,而不是简单地建议一段代码... – Umberto

+0

@fasttouch:我想要一个条形图,可视化地分隔两个或更多的数据分组(这里由苹果和香蕉),而不是通过颜色,而是通过位置,即使分组没有相同数量的值,条也是相同的宽度。 –

回答

2

像这样的事情?:

yvalue = c(.1, .2, .3, .2, .1, .2, .3, .1) 
df = data.frame(yvalue) 
df$name = c("a", "b", "c", "d", "e", "f", "g", "h") 
df$type = c("apple", "apple", "apple", "apple", "apple", "banana", "banana", "banana") 

fulldat <- rbind(df, cbind(yvalue=NA,expand.grid(name=df$name,type=df$type))) 

ggplot(data = fulldat) + geom_bar(aes(y = yvalue, x=type, fill=name),width=0.5,stat = "identity",position=position_dodge(0.9)) + 
    guides(fill=FALSE) + scale_fill_manual(values = rep("red",8)) 
+0

这在颜色和图例方面很好,但酒吧的宽度不一样:香蕉酒吧比苹果酒吧宽。还有一种方法可以在酒吧之间添加一个小的分隔或边界? –

+0

修复geom_bar宽度非常棘手,它将根据每个因子级别内的特征数量来选择宽度。这(创建'fulldat')是一个基于https://stackoverflow.com/questions/11020437/consistent-width-for-geom-bar-in-the-event-of-missing-data的hacky解决方案,您可以更改width/position_dodge宽度来增加酒吧间的空间 – timfaber

+0

谢谢。我认为这是答案,因为它是有效的,但我只是最终制作了两个不同的条形图并将它们放在一个图像编辑器中,因为正如你所说这很不方便。似乎这是ggplot只是没有设计的那些东西之一。顺便说一下,你能向我解释一件事:为什么ggplot需要“fill = name”在那里,然后需要“scale_fill_manual()”使所有的颜色都一样?当我在我的原始代码中简单地取出“fill = name”时,我只是得到了两个伟大的酒吧大块。 –

1

,你从色彩和传奇摆脱两者。

您可以使用以下代码:我使用facets来保留图片中的“类型”。

ggplot(data = df) + 
geom_bar(aes(y = yvalue, x=name), stat = "identity", position = position_dodge()) + 
facet_wrap(~type) + 
theme_classic() 

请让我知道这是你想要的。

+0

这很有趣,但我不希望在不重叠名称下的空白空间。 –