如何绘制具有不同范围的多列的箱线图

Ali*_*ali 9 python boxplot plotly seaborn

我想绘制数据框多列的箱线图。使用 R,我可以使用轴并设置不同的范围以按照我想要的方式显示绘图。但在 python 中,我只能有一个范围,不能为不同的列设置不同的范围。如何在 python 中绘制类似于 ggplot2 的箱线图?

我的代码片段如下。我还放了ggplot、seaborn和plotly的结果。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_excel('data-rta-3phase-boxplot.xlsx', header=0)

sns.boxplot(x="variable", y="value", data=pd.melt(df))
plt.show()

import plotly.graph_objects as go

fig = go.Figure()

for col in df:
  fig.add_trace(go.Box(y=df[col].values, name=df[col].name))
  
fig.show()
Run Code Online (Sandbox Code Playgroud)

我想要的看起来像这样(用R中的ggplot2创建)

在此输入图像描述

这些是我在plotly和seaborn中得到的

在此输入图像描述 在此输入图像描述

更新!!!!!

在社区的指导下,我成功创建了一个完全可控的代码来绘制箱线图。

import pandas as pd
import plotly.express as px

df = pd.read_excel('data-rta-3phase-boxplot.xlsx', header=0)

fig = px.box(df.melt(), y="value", facet_col="variable", boxmode="overlay", color="variable")
fig.update_yaxes(matches=None)

for i in range(len(fig["data"])):
    yaxis_name = 'yaxis' if i == 0 else f'yaxis{i + 1}'
    fig.layout[yaxis_name].showticklabels = True

fig.update_layout(legend = dict(bgcolor = 'white'))
fig.update_layout(plot_bgcolor='white')

fig.update_xaxes(showline=True, linewidth=2, linecolor='black')#, mirror=True)
fig.update_yaxes(showline=True, linewidth=2, linecolor='black')#, mirror=True)

fig.update_xaxes(showgrid=True, gridwidth=1, gridcolor='gray')
fig.update_yaxes(showgrid=True, gridwidth=1, gridcolor='gray')

fig.show()
Run Code Online (Sandbox Code Playgroud)

ima*_*bet 8

您可以使用不同的值范围绘制多个箱线图plotly

from plotly.subplots import make_subplots
import plotly.graph_objects as go

vars = ['DurationHours', 'Consumption', 'Rate', 'Conversion']
fig = make_subplots(rows=1, cols=len(vars))
for i, var in enumerate(vars):
    fig.add_trace(
        go.Box(y=df[var],
        name=var),
        row=1, col=i+1
    )

fig.update_traces(boxpoints='all', jitter=.3)
Run Code Online (Sandbox Code Playgroud)

结果将是这样的: 在此输入图像描述


Dan*_*l R 6

如果您愿意使用plotlyexpress,您可以使用facets资源并将y轴设置为facet之间不匹配:

import plotly.express as px
px.box(df.melt(), y='value', facet_col='variable').update_yaxes(matches=None)
Run Code Online (Sandbox Code Playgroud)