2013-07-14 58 views
1

使用Rpy2翻轉座標訂購GGPLOT2吧我有在Python的R數據框對象,使用Rpy2,看起來像這樣:可以用Python

cat name num 
1 a bob 1 
2 b bob 2 
3 a mary 3 
4 b mary 4 

我想繪製它與翻轉COORDS一個geom_bar,和條的順序與圖例的順序相匹配(不更改圖例)。這已經在這裏和其他郵件列表上問過了,但是我一直在關於如何將R訂購代碼翻譯成rpy2。這是我當前的代碼:

# attempting to reorder bars so that value 'a' of cat is first (in red) 
# and value 'b' of cat is second (in green) 
labels = tuple(["a", "b"]) 
labels = robj.StrVector(labels) 
variable_i = r_df.names.index("cat") 
r_df[variable_i] = robj.FactorVector(r_df[variable_i], 
            levels=labels) 
r.pdf("test.pdf")) 
p = ggplot2.ggplot(r_df) + \ 
    ggplot2.geom_bar(aes_string(x="name", 
           y="num", 
           fill="cat"), 
        position=ggplot2.position_dodge(width=0.5)) + \ 
    ggplot2.coord_flip() 
p.plot() 

這給具有正確傳說的圖形(「A」是第一紅色,「B」是第二次在綠色),但酒吧的順序顯示綠/紅( 'b','a')爲'name'的每個值。來自prev的我的印象。帖子是,這是因爲coord_flip()翻轉訂單。如何更改酒吧訂單(不是圖例順序)以匹配當前圖例,在每個躲閃條形組中首先繪製紅色條形圖?謝謝。

編輯:*

試圖@ joran在rpy2解決方案:

labels = tuple(["a", "b"]) 
labels = robj.StrVector(labels[::-1]) 
variable_i = r_df.names.index("cat") 
r_df[variable_i] = robj.FactorVector(r_df[variable_i], 
            levels=labels) 
p = ggplot2.ggplot(r_df) + \ 
    ggplot2.geom_bar(aes_string(x="name", 
           y="num", 
           fill="cat"), 
        stat="identity", 
        position=ggplot2.position_dodge()) + \ 
    ggplot2.scale_fill_manual(values = np.array(['blue','red'])) + \ 
    ggplot2.guides(fill=ggplot2.guide_legend(reverse=True)) + \ 
    ggplot2.coord_flip() 
p.plot() 

這不起作用,因爲ggplot2.guides沒有找到,但這只是設置的傳說。我的問題是:爲什麼需要scale_fill_manual?我不想指定自己的顏色,我想要默認的ggplot2顏色,但我只想將排序設置爲特定的方式。這是有道理的,與coord_flip我需要一個相反的順序,但這是不足以重新排列酒吧顯然(獨立於圖例我的labels[::-1])。對此有何想法?

+1

ggplot2的'guides'沒有被模塊'rpy2.robjects.lib.ggplot2'自定義映射('guides'是比較近的,我錯過了它的介紹,沒有人抱怨到現在爲止)。與此同時,試着用'ggplot2.ggplot2.guides()'修改你的代碼。 – lgautier

回答

2

我很抱歉,我沒有在我的機器上RPY設置,但我能得到我知道你在這個R/GGPLOT2代碼描述:

dat$cat <- factor(dat$cat,levels = c('b','a')) 

ggplot(dat,aes(x = name,y = num, fill = cat)) + 
    geom_bar(stat = "identity",position = "dodge") + 
    coord_flip() + 
    scale_fill_manual(values = c('blue','red')) + 
    guides(fill = guide_legend(reverse = TRUE)) 

enter image description here

基本上,我只是扭轉了因素水平,並扭轉了傳說的順序。捲土重來,但看起來像你所描述的。 (另外,你確實想要stat = "identity",對嗎?)

+0

@jordan:謝謝 - 看到我的編輯作出迴應 – user248237dfsf

+0

@ user248237dfsf「guides」會引發這樣的錯誤的唯一原因是,如果(a)您安裝了ggplot的舊版本,或者(b)rpy以某種方式運行厲害。我只使用'scale_manual',因爲否則你會以相反的順序將a和b映射到默認顏色;顯示你想要它們的方式,但是將第一個默認顏色映射到b。如果你不關心這個,就省略它。 – joran

+0

@jordan:爲什麼它不足以執行'dat $ cat < - factor(dat $ cat,levels = c('b','a'))'來反轉這些條?至少rpy2等價物不會那樣做,它需要'scale_fill_manual'。關於顏色:我可以在沒有明確說明它們的情況下將其撤消嗎我希望ggplot選擇顏色,而無需輸入十六進制顏色或顏色名稱 – user248237dfsf