1

次のコードを Rpy2 に変換しようとしていますが、成功しません。

neworder <- c("virginica","setosa","versicolor")
library("plyr")
iris2 <- arrange(transform(iris,
             Species=factor(Species,levels=neworder)),Species)

factorこれは、特定の列 (この場合は ) の順序を変更することだけを目的としていますSpecies

plyrPythonオブジェクトとしてプロットされたデータフレームを変更するだけなので、Rpy2でもそれらすべてを使用したくありません。以下は機能しません。

# 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を変更したいと考えています。ありがとう。a, b, cfactorvariable

編集このコードで順序を変更できました:

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()

生成:

ここに画像の説明を入力

しかし、私が追加すると:

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)

プロットする前に、次のようになります。

ここに画像の説明を入力

これは、私が使用する名前がSpecies名前の値と正確に一致しないためだと思います。これが発生したときに rpy2 がエラーを発生させてくれると助かります。しかし、いずれにせよ、因子の名前を上書きしたい場合はどうすればよいでしょうか? つまり、最初の因子名をx、2 番目yなどにして、その順序で表示しますか? データフレームに正しい名前で新しい列を作成する唯一の方法はありますか?

4

1 に答える 1

2

オンザフライ (以下の最初の例) またはデータ フレームの列 (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()
于 2013-03-08T15:46:33.660 に答える