如何使用plotly绘制标准密度曲线?

时间:2018-07-12 01:01:47

标签: python plotly

如何使用plotly在python中绘制密度曲线?

具体来说,我想在某些标准密度下这样做。


更新:

到目前为止,(在Jupyter笔记本中)实现我所要求的最佳方法:

import numpy as np
from scipy import stats

import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
init_notebook_mode(connected=True)

绘图

xrange = np.arange(-4.5,5,0.0025)
norm = go.Scatter(x=xrange, 
                  y=stats.norm(loc=0, scale=1).pdf(xrange), 
                  mode='lines',
                  line=dict(width=1.5),
                  name='Normal',
                 )
lognorm = go.Scatter(x=xrange[xrange>0], 
                     y=stats.lognorm(s=1, loc=0, scale=1).pdf(xrange[xrange>0]), 
                     mode='lines',
                     line=dict(width=1.5),
                     name='Lognormal',
                    )
cauchy = go.Scatter(x=xrange, 
                     y=stats.cauchy(loc=0, scale=1).pdf(xrange), 
                     mode='lines',
                     line=dict(width=1.5),
                     name='Cauchy',
                    )
data = [norm, lognorm, cauchy]
iplot(data, show_link=False)

enter image description here


我一直在寻找一种简单,简约的方法,例如在 Mathematica 中完成的操作

Plot[{PDF[NormalDistribution[], x], PDF[LogNormalDistribution[0, 1], x], PDF[CauchyDistribution[], x]}, {x, -4.5, 4.5}]

enter image description here

1 个答案:

答案 0 :(得分:1)

下面的代码使用gaussian_kde。这些图位于iplot()plotlymatplotlibseaborn中,以将它们进行比较。 (Jupyter Notebook 5.0.0Python 3.6.6

# Import libraries
import pandas as pd
import numpy as np
from numpy import linspace
import seaborn as sns
from matplotlib import pyplot as plt
import scipy.stats as st
from scipy.stats.kde import gaussian_kde

import plotly.offline as pyo
import plotly.graph_objs as go
from plotly import __version__
%matplotlib inline

import cufflinks as cf
from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot 
init_notebook_mode(connected=True)

init_notebook_mode(connected=True)
cf.go_offline()

创建示例数据

np.random.seed(1)
data = pd.DataFrame(np.random.randn(500,1), columns=['x'])
data.head(2)

计算kde个值并将其放入数据框

df = pd.DataFrame({'x_range': linspace(min(data['x']), max(data['x']), len(data['x'])),
                     'x_kde': kde(x_range) 
                    })

使用iplot()创建图

df.iplot(x='x_range', y='x_kde')

enter image description here

使用plotly创建图 注意:此图将在新的浏览器窗口中打开

# Create trace, data and layout 
trace = go.Scatter(x=df['x_range'],y=df['x_kde'], mode='markers',name='markers')
data = [trace]
layout = go.Layout(title='Line Chart')
# Plot figure
fig = go.Figure(data=data, layout=layout)
pyo.offline.plot(fig)

enter image description here

使用Seaborn进行绘制

sns.distplot(data['x'], hist=False, rug=True)

enter image description here

使用基础plot

data['x'].plot.density()

enter image description here

使用Matplotlib进行绘制

kde = gaussian_kde(data.x)
x_range = linspace(min(data.x), max(data.x), len(data.x))
plt.plot(x_range, kde(x_range) )

enter image description here

修改。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。

一种方法是编译dataframe中的所有值,然后将其一行发送到iplot()

创建数据框

df = pd.DataFrame({'xrange':np.arange(-4.5,5,0.0025)})
df['norm_x'] = stats.norm(loc=0, scale=1).pdf(df['xrange'])
df['cauchy_x'] = stats.cauchy(loc=0, scale=1).pdf(df['xrange'])
df['lognormal_x'] = stats.lognorm(s=1, loc=0, scale=1).pdf(df['xrange'])
df = pd.DataFrame({'xrange':xrange, 'norm_x':norm_x, 'cauchy_x':cauchy_x, 'lognormal_x':lognormal_x})

使用iplot()

df.iplot(x='xrange', y=['norm_x', 'cauchy_x', 'lognormal_x'])

enter image description here

相关问题