如何根据应用于单列的条件和同一数据帧的另一列上可用的数据绘制子图?

How to plot subplots from a condition applied on a single column and the data available on another single column of the same dataframe?

我有一个数据框,它很像下面的数据框:

data = {'A':[21,22,23,24,25,26,27,28,29,30,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5,6,7,8,9,10],
        'B':[8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3],
        'C':[10,15,23,17,18,26,24,30,35,42,44,42,38,36,34,30,27,25,27,24,1,0,2,3,5,26,30,40,42,50]}

data_df = pd.DataFrame(data)
data_df

我想要子图,子图的数量应该等于列 'B' 的唯一值的数量。 X 轴 = 列 'A' 中的值,Y 轴 = 列 'C'.

中的值

我试过的代码:

fig = px.line(data_df, 
              x='A', 
              y='C', 
              color='B',
              facet_col = 'B',
              )
fig.show()

给出类似

的输出

但是,我希望将图表放在单列中,每个图表自动缩放到轴上的相关区域和分辨率。 可能性:我能以某种方式利用 groupby 命令来做到这一点吗?

由于基于其他数据,我可能在 'B' 列中有其他数量的唯一值(例如 5 个唯一值),因此我希望这段代码能够动态工作。请帮助我。

PS: plotly express模块​​用于绘制图形。

您可以改为使用参数 facet_row = 'B',它将自动按行堆叠子图。然后要自动重新缩放,您需要将所有 x 数据设置为相同的值数组,这可以通过循环 fig.data 并为每个 i 修改 fig.data[i]['x'] 来完成。

import pandas as pd
import plotly.express as px

data = {'A':[21,22,23,24,25,26,27,28,29,30,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5,6,7,8,9,10],
        'B':[8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3],
        'C':[10,15,23,17,18,26,24,30,35,42,44,42,38,36,34,30,27,25,27,24,1,0,2,3,5,26,30,40,42,50]}

data_df = pd.DataFrame(data)
fig = px.line(data_df, 
              x='A', 
              y='C', 
              color='B',
              facet_row = 'B',
              )
for fig_data in fig.data:
    fig_data['x'] = list(range(len(fig_data['y'])))
fig.show()

为了将所有子图堆叠在一列中,并确保每个 x 轴都是独立的,只需在您的 px.line() 调用中添加以下内容:

facet_col_wrap=1

然后跟进:

fig.update_xaxes(matches=None)

绘图 1:使用 px.line(facet_col = 'B')

的默认设置

如果您想显示所有 x-axis 标签,只需包含以下内容:

fig.update_xaxes(showticklabels = True)

情节 2:显示 x-axes 所有子情节

完整代码:

import plotly.express as px
import pandas as pd
data = {'A':[21,22,23,24,25,26,27,28,29,30,11,12,13,14,15,16,17,18,19,20,1,2,3,4,5,6,7,8,9,10],
        'B':[8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,3,3,3,3,3,3,3,3,3,3],
        'C':[10,15,23,17,18,26,24,30,35,42,44,42,38,36,34,30,27,25,27,24,1,0,2,3,5,26,30,40,42,50]}

data_df = pd.DataFrame(data)
data_df

fig = px.line(data_df, 
              x='A', 
              y='C', 
              color='B',
              facet_col = 'B',
              facet_col_wrap=1
             )
fig.update_xaxes(matches=None, showticklabels = True)
fig.show()