2017-05-22 118 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

這很有趣,但我不希望在不重疊名稱下的空白空間。 –