Skip to main content
 首页 » 编程设计

python之在python中使用rpy2将分位数输入ggplot geom_boxplot

2025年05月04日7xiaohuochai

我有以下箱线图:

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

我的问题是:如何更改箱线图中绘制的晶须/分位数?假设我有一个数据框,我可以在其中按行或列计算分位数,如:

quantiles_df = iris.quantiles(q=0.85, axis=1) 

那么我如何使用 quantiles_df 作为 geom_boxplot 的输入,以便它绘制例如 0.2 到 0.85 百分位数而不是标准的 0.25 到 0.75?谢谢。

请您参考如下方法:

您可以在 R 中从这个开始。首先计算变量(此处为 Petal.Width)的每个物种的百分位数,并将这些用于绘图。通过指定 ymin(=下晶须边界)、lower(=盒子的下边界)、middle(=盒子中的线)、upper(= 框的上边界),ymax(= 上晶须边界)并添加 stat = "identity" 您可以自定义箱线图。

library(reshape2) 
library(plyr) 
library(ggplot2) 
 
dataf <- ddply(iris, .(Species), summarize, quantilesy= quantile(Petal.Width, c(0,0.2, 0.5,0.85,1 ))) 
dataf$Labels <- rep(c("0%", "20%","50%","85%", "100%"),length(unique(dataf$Species))) 
 
dataf2 <- reshape(dataf , idvar = c("Species"),timevar = "Labels", direction = "wide") 
datafmeanx <- ddply(iris, .(Species), summarize, meanx= mean(Petal.Length)) 
dataf3 <- merge(dataf2,datafmeanx) 
 
b <- ggplot(dataf3 , aes(x=meanx,ymin = `quantilesy.0%`, lower = `quantilesy.20%`, middle = `quantilesy.50%`, upper = `quantilesy.85%`, ymax = `quantilesy.100%`)) 
b + geom_boxplot(stat = "identity")+ facet_grid(Species~.) + xlab("Mean PetalLength") + ylab("PetalWidth") 

编辑:如果您不想使用反引号(请参阅评论):

dataf$Labels <- rep(c("0", "20","50","85", "100"),length(unique(dataf$Species))) 
 
dataf2 <- reshape(dataf , idvar = c("Species"),timevar = "Labels", direction = "wide") 
datafmeanx <- ddply(iris, .(Species), summarize, meanx= mean(Petal.Length)) 
dataf3 <- merge(dataf2,datafmeanx) 
 
b <- ggplot(dataf3 , aes(x=meanx ,ymin = quantilesy.0, lower = quantilesy.20, middle = quantilesy.50, upper = quantilesy.85, ymax = quantilesy.100)) 
b + geom_boxplot(stat = "identity")+ facet_grid(Species~.) + xlab("Mean PetalLength") + ylab("PetalWidth")