次のコードを Rpy2 に変換しようとしていますが、成功しません。
neworder <- c("virginica","setosa","versicolor")
library("plyr")
iris2 <- arrange(transform(iris,
Species=factor(Species,levels=neworder)),Species)
factor
これは、特定の列 (この場合は ) の順序を変更することだけを目的としていますSpecies
。
plyr
Pythonオブジェクトとしてプロットされたデータフレームを変更するだけなので、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, c
factor
variable
編集このコードで順序を変更できました:
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
などにして、その順序で表示しますか? データフレームに正しい名前で新しい列を作成する唯一の方法はありますか?