Как построить коробчатые диаграммы из нескольких столбцов с разными диапазонами - PullRequest
2 голосов
/ 14 июля 2020

Я хочу построить коробчатую диаграмму из нескольких столбцов фрейма данных. С помощью 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()

То, что я хочу, выглядит так (создано с помощью ggplot2 в R)

enter image description here

and these are what I get in plotly and seaborn

enter image description here введите описание изображения здесь

ОБНОВЛЕНИЕ !!!!!

Под руководством сообщества мне удалось создать полностью управляемый код для рисования коробчатых диаграмм.

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

1 Ответ

1 голос
/ 14 июля 2020

Если вы хотите использовать plotly express, вы можете использовать ресурс фасетов и установить ось Y, чтобы не совпадать между фасетами:

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