Plotly Distplot子图

4
我试图编写一个for循环,用于distplot子图。我有一个数据框具有许多不同长度的列。(不包括NaN值)
fig = make_subplots(
    rows=len(assets), cols=1,
    y_title = 'Hourly Price Distribution')

i=1 
for col in df_all.columns:
    fig = ff.create_distplot([[df_all[[col]].dropna()]], col)
    fig.append()
    i+=1
fig.show()

我试图为distplots运行一个子图的for循环,但出现了以下错误:

PlotlyError:糟糕!您的数据列表或ndarrays应该具有相同的长度。

更新: 下面是一个示例:

df = pd.DataFrame({'2012': np.random.randn(20),
           '2013': np.random.randn(20)+1})
df['2012'].iloc[0] = np.nan
fig = ff.create_distplot([df[c].dropna() for c in df.columns],
df.columns,show_hist=False,show_rug=False)
fig.show()

我想在不同的子图中绘制每个分布。谢谢。

你最近的建议效果如何? - vestland
它还没有起作用,但我会尝试再微调一下。我将路由到只绘制每个图形。 不过还是谢谢你的帮助。 - MathMan 99
1个回答

2

更新:分布图

使用numpy计算正确的值可能比较快速且优雅。但我经常使用Plotly的一种方法(图形工厂,plotly express)构建我的图形的部分,并将其与其他Plotly库的元素(plotly.graph_objects)结合使用以达到我想要的结果。下面的完整代码片段展示了如何做到这一点,以构建一个基于goff.create_distplot元素的subplot。如果以下建议符合您的需求,我很乐意提供进一步的解释。

绘图

enter image description here

完整代码

import numpy as np
import pandas as pd
import plotly.express as px
import plotly.figure_factory as ff
from plotly.subplots import make_subplots
import plotly.graph_objects as go

df = pd.DataFrame({'2012': np.random.randn(20),
           '2013': np.random.randn(20)+1})
df['2012'].iloc[0] = np.nan

df = df.reset_index()
dfm = pd.melt(df, id_vars=['index'], value_vars=df.columns[1:])
dfm = dfm.dropna()

dfm.rename(columns={'variable':'year'}, inplace = True)
cols = dfm.year.unique()
nrows = len(cols)

fig = make_subplots(rows=nrows, cols=1)

for r, col in enumerate(cols, 1):
    dfs = dfm[dfm['year']==col]
    fx1 = ff.create_distplot([dfs['value'].values], ['distplot'],curve_type='kde')
    fig.add_trace(go.Scatter(
                                x= fx1.data[1]['x'],
                                y =fx1.data[1]['y'],
                              ), row = r, col = 1)

fig.show()

第一条建议


您应该:

1. 使用 pd.melt(df, id_vars=['index'], value_vars=df.columns[1:]) 重新构造数据,

2. 并使用出现的列 'variable' 通过 facet_row 参数为每个 year 构建子图,以获得以下结果:

enter image description here

在下面的完整代码片段中,您会看到我已经将 'variable' 更改为 'year',以使绘图更加直观。这种方法有一个特别方便的副作用,即运行 dfm.dropna() 将仅删除 2012 中的 na 值。如果您在原始数据框上执行相同的操作,则会删除同一行中 2013 的相应值。

import numpy as np
import pandas as pd
import plotly.express as px

df = pd.DataFrame({'2012': np.random.randn(20),
           '2013': np.random.randn(20)+1})
df['2012'].iloc[0] = np.nan

df = df.reset_index()
dfm = pd.melt(df, id_vars=['index'], value_vars=df.columns[1:])
dfm = dfm.dropna()

dfm.rename(columns={'variable':'year'}, inplace = True)
fig = px.histogram(dfm, x="value",
                   facet_row = 'year')
fig.show()

我想绘制密度图而不是直方图。据我搜索所得,Plotly Express没有密度图,而是属于Figure Factory的一部分。我尝试在您的代码中使用create_distplot,但它没有起作用。 - MathMan 99
@MathMan99 我知道了...等我有时间再去看一下。 - vestland
有任何更新吗?另外请注意,DataFrame具有多个长度不同的列。 - MathMan 99
也许明天吧。随时提醒我都可以。 - vestland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接