2013-03-07 48 views
0

我想下面的代碼,但沒有成功轉化爲Rpy2變化因素秩序case Species在GGPLOT2與Rpy2在Python

我不想使用plyr和所有的東西在Rpy2過,因爲我可以修改數據幀繪製成一個Python對象。以下不起作用:

# start with Python df 'mydf' and convert to R df 
# to get mydf_r. The column equivalent of Species here 
# is "variable" 
# ... 
mydf_r.variable = r.factor(ro.StrVector(["a", "b", "c"])) 
# call ggplot... 
ggplot2.ggplot(mydf) + ... 

這是行不通的。我怎樣才能獲得R代碼的等價物?即我有一個的variable繪製c, b, a幾個值的融化數據框,我想改變順序改變factor秩序variablea, b, c。謝謝。

編輯我能夠使用此代碼更改順序:

labels = robj.StrVector(tuple(["a", "b", "c"])) 
variable_factor = r.factor(labels, levels=labels) 
r_melted = r.transform(r_melted, **{"variable": variable_factor}) 
p = ggplot2.ggplot(r_melted) + \ 
    ggplot2.geom_boxplot(aes_string(**{"x": "variable", 
             "y": "value" 
             "fill": "group"})) + \ 
    ggplot2.scale_fill_manual(values=np.array(["#00BA38", "#F8766D"])) + \ 
    ggplot2.coord_flip() 

然而,這打破ggplot的由group變量正確地作出箱線圖和顏色代碼它的能力。如果我刪除線:

labels = robj.StrVector(tuple(["a", "b", "c"])) 
variable_factor = r.factor(labels, levels=labels) 
r_melted = r.transform(r_melted, **{"variable": variable_factor}) 

然後一切工作正常...我要的是改變其中variable值出現在箱線圖的順序。

@lgautier:你給的解決方案看起來像我想要的東西,但它不爲我在這裏工作。我做了一個試驗案例它與iris數據集:

原創情節

import os 
iris = pandas.read_table(os.path.expanduser("~/iris.csv"), 
         sep=",") 
iris["Species"] = iris["Name"] 
r_melted = conversion_pydataframe(iris) 
p = ggplot2.ggplot(r_melted) + \ 
    ggplot2.geom_boxplot(aes_string(**{"x": "PetalLength", 
             "y": "PetalWidth", 
             "fill": "Species"})) + \ 
    ggplot2.facet_grid(Formula("Species ~ .")) + \ 
    ggplot2.coord_flip() 
p.plot() 

生產:

enter image description here

但是,如果我補充一下:

labels = robj.StrVector(tuple(["versicolor", "virginica", "setosa"])) 
variable_i = r_melted.names.index("Species") 
r_melted[variable_i] = robj.FactorVector(r_melted[variable_i], 
             levels=labels) 

PRI或繪圖,我得到:

enter image description here

我想這是因爲我使用的名稱不完全匹配的Species名稱值。如果rpy2在發生這種情況時發生錯誤,那將會很有幫助。但無論如何,如果我想覆蓋該因素的名稱怎麼辦?即採取的第一個因素的名稱,並使其x,第二y等,並將它顯示的順序?唯一的方法是在數據框中使用正確的名稱爲它創建一個新的列?

+1

更改爲標籤水平是一個不同的問題。當因素被創建時,你可以這樣做('FactorVector(['a','b','c'],labels = StrVector(['Le A','Le B','Le C'])) '')或因子創建後('f = FactorVector(['a','b','c']); f.levels [0] ='A'') – lgautier 2013-03-09 21:22:14

+0

您獲得一個灰色框,不對應於矢量中的任何標籤。沒有警告,因爲在這種情況下,R不會產生警告(嘗試在R中:factor(c(「a」,「b」,「c」),levels = c(「A」)))。我認爲,其邏輯是假設,如果明確指定級別,則不匹配的級別應標記爲「NA」。 ' – lgautier 2013-03-09 21:27:29

回答

2

你需要改變所使用的因子的水平,或者在即時(下面第一實施例),或在用於所述數據幀(第二個例子)柱。

如果labels是一個相對較短的名單下面將只是工作:

# r_melted is the one defined upstream of your code snippet, 
# not the results of calling r.transform() 
labels = robj.StrVector(tuple(["a", "b", "c"])) 
p = ggplot2.ggplot(r_melted) + \ 
    ggplot2.geom_boxplot(aes_string(**{"x": "factor(variable, levels = %s)" % labels, 
             "y": "value" 
             "fill": "group"})) + \ 
    ggplot2.scale_fill_manual(values=np.array(["#00BA38", "#F8766D"])) + \ 
    ggplot2.coord_flip() 

如果labels較大(或根本沒有R代碼是希望):

# r_melted is the one defined upstream of your code snippet, 
# not the results of calling r.transform() 
from rpy2.robjects.vectors import FactorVector 
variable_i = r_melted.names.index('variable') 
r_melted[variable_i] = FactorVector(r_melted[variable_i], 
            levels = robj.StrVector(tuple(["a", "b", "c"])) 
p = ggplot2.ggplot(r_melted) + \ 
    ggplot2.geom_boxplot(aes_string(**{"x": "variable", 
             "y": "value" 
             "fill": "group"})) + \ 
    ggplot2.scale_fill_manual(values=np.array(["#00BA38", "#F8766D"])) + \ 
    ggplot2.coord_flip() 
+0

謝謝。更普遍的是有沒有必要像上面的原始代碼一樣從Rpy2中調用'plyr'?或者是否有可能/最好始終在Python中執行這些數據框操作,然後在準備繪圖時將結果轉換爲R數據框? – user248237dfsf 2013-03-08 23:04:34

+0

不幸的是,這兩種方法都不適用於我 - 我編輯了我的帖子,並提供了我得到的輸出的詳細示例。有任何想法嗎? – user248237dfsf 2013-03-09 19:17:56

+0

@ user248237dfsf:我會說:以你最舒服的方式開始。如果你感到舒服會導致看起來過於複雜的代碼或性能問題,那麼你仍然可以嘗試其他方式。 – lgautier 2013-03-09 20:05:03