【问题标题】:Plotly Distplot subplotsPlotly Distplot 子图
【发布时间】:2021-09-19 09:35:33
【问题描述】:

我正在尝试为 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()

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

谢谢。

【问题讨论】:

  • 我的最新建议对您有何帮助?
  • 它仍然没有工作,但我会尝试对其进行更多调整。我路由只是单独绘制每个图表。不过谢谢你的帮助。

标签: python pandas dataframe plotly distribution


【解决方案1】:

更新:分布图

使用numpy 计算正确的值可能更快更优雅。但是我经常使用一种绘图方法(图形工厂,绘图表达)构建我的图表的一部分,然后将它们与绘图库的其他元素(plotly.graph_objects)一起使用以获得我想要的东西。下面的完整 sn-p 向您展示了如何做到这一点,以便使用来自 ff.create_distplot 的元素构建基于 subplotgo。如果以下建议适合您的需要,我很乐意提供进一步的解释。

绘图

完整代码

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 构建子图以获得此:

在下面的完整 sn-p 中,您会看到我已将 'variable' 更改为 'year' 以使情节更直观。这种方法有一个特别方便的副作用,即运行dfm.dropna() 将删除2012na。如果您要对原始数据框执行相同的操作,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 没有密度图,而是图形工厂的一部分。我尝试在您的代码中使用 create_distplot,但它不起作用。
  • @MathMan99 我明白了……有时间我再看看。
  • 有什么更新吗?另请注意,DataFrame 有多个不同长度的列。
  • 也许明天。请随时再次提醒我。
猜你喜欢
  • 2022-01-16
  • 2018-09-11
  • 2018-02-02
  • 2022-01-10
  • 2022-06-11
  • 2017-12-25
  • 2022-01-15
  • 2021-10-24
  • 2021-02-22
相关资源
最近更新 更多