2015-02-11 73 views
1

我有以下代碼來繪製不同國家的合同。ggplot2 geom_bar fill aesthetic

Country <- CCOM$Principal.Place.of.Performance.Country.Name 
Val <- CCOM$Action_Absolute_Value 
split <- CCOM$Contract.Category 

ggplot(CCOM, aes(x = Country, y = Val, fill = levels(split))) + 
    geom_bar(stat = "identity") 

我想與合同類別,它是變量「分裂」五色棒的簡單堆積條形圖(即CCOM $ Contract.Category)。

然而,當我運行的代碼它產生如下圖:

enter image description here

爲什麼不會gplot支出分成三個不同的塊?爲什麼我會在整個圖表中分散顏色部分?我嘗試過使用因子(分裂)和水平(分裂),但似乎沒有工作。也許我把它放在錯誤的位置上。

+1

嘗試'ggplot(CCOM,AES(X =國家,Y =纈氨酸,填寫= Contract.Category))' – Andrie 2015-02-11 20:54:50

+0

請添加數據的最小的樣品,所以代碼將是可重複的。 – tonytonov 2015-02-12 06:59:15

+0

沒關係。當我通過合同類別訂購數據集時,它可以工作。我不知道爲什麼我必須這樣做。應該不需要,但在短期內問題就解決了。 – user2907249 2015-02-12 16:34:36

回答

0

你的建議order提供了一個解決方案:

ggplot(CCOM[order(CCOM$split), ], aes(x = Country, y = Val, fill = Contract.Category)) + 
    geom_bar(stat = "identity") 

我有,我用的fillContact.Category相當於一個類似的例子,它仍然需要重新排序。

+0

更好的解決方案是安德里的評論。創建列的副本並在副本上使用'levels()'會產生問題。只需直接使用該列'fill = Contract.Category'即可跳過該問題。 – Gregor 2015-11-19 00:10:22

+0

調整了答案 – 2015-11-20 00:30:00

+0

沒有OP的數據就無法測試,但使用簡化的'fill','order'應該是不必要的。 – Gregor 2015-11-20 00:43:30

1

啊,我剛剛意識到發生了什麼事情。你似乎很害怕修改你的數據框,不要!爲ggplot創建外部向量正在尋求麻煩。而不是創建CountryVal鬆散的載體,將其添加爲列數據:

CCOM$Country <- CCOM$Principal.Place.of.Performance.Country.Name 
CCOM$Val <- CCOM$Action_Absolute_Value 

那麼你的情節是美好而簡單,你不必擔心訂單或其他任何東西。

ggplot(CCOM, aes(x = Country, y = Val, fill = Contract.Category)) + 
    geom_bar(stat = "identity")