python - 绘制 Distplot 子图

标签 python pandas dataframe plotly distribution

我正在尝试为 distplot 子图编写一个 for 循环。
我有一个包含许多不同长度列的数据框。 (不包括 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:糟糕!您的数据列表或 ndarray 应该具有相同的长度。
更新:
这是下面的示例:
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()
我想在不同的子图中绘制每个分布。
谢谢你。

最佳答案

更新:分布图
使用 numpy 计算正确的值可能更快更优雅.但我经常使用一种 plotly 方法(图形工厂,plotly express)构建我的图形的一部分,然后将它们与 plotly 库(plotly.graph_objects)的其他元素一起使用以获得我想要的。下面的完整片段向您展示了如何做到这一点以构建 go基于 subplot来自 ff.create_distplot 的元素.如果以下建议适合您的需要,我很乐意提供进一步的解释。
阴谋
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'为每个 year 建立子图通过 facet_row得到这个的论点:
enter image description here
在下面的完整片段中,您会看到我已更改 'variable''year'为了让剧情更直观。这种方法有一个特别方便的副作用,即运行 dfm.dropna()将删除 na 2012 的值只有 .如果您要对原始数据帧执行相同的操作,则 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()

关于python - 绘制 Distplot 子图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68309750/

相关文章:

python - 如何将值从一个 python 脚本返回到另一个?

python - Pandas 使用格式更新 Excel 文件

python - 创建数据框时限制元组列表中的列

python - 无法找出使用 apply lambda 在数据帧上实现 if 语句的正确方法

r - 按组清除 R 数据框中的行

python - 替代 zip 的其他方式

python - 等效于 Linux 上的 GetTickCount()

python - 添加 numpy 时破坏了我的 python 构建

python - 获取与关键字匹配的每个数据框单元格的内容

python - 从 Pandas Dataframe 列返回最大值和最小值的实际索引值