我正在尝试将以下代码翻译成Rpy2但没有成功:
neworder <- c("virginica","setosa","versicolor")
library("plyr")
iris2 <- arrange(transform(iris,
Species=factor(Species,levels=neworder)),Species)
这只是为了更改特定列的factor
顺序,在本例中为Species
。
我不想在Rpy2中使用plyr
和所有这些东西,因为我可以修改绘制为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
,我想通过更改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正确制作boxplot的能力,并通过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
,第二个y
等,并按顺序显示?唯一的方法是使用数据框中的正确名称为其创建新列吗?
答案 0 :(得分: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()