如何使用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)
我一直在寻找一种简单,简约的方法,例如在 Mathematica 中完成的操作
Plot[{PDF[NormalDistribution[], x], PDF[LogNormalDistribution[0, 1], x], PDF[CauchyDistribution[], x]}, {x, -4.5, 4.5}]
答案 0 :(得分:1)
下面的代码使用gaussian_kde
。这些图位于iplot()
,plotly
,matplotlib
和seaborn
中,以将它们进行比较。 (Jupyter Notebook 5.0.0
,Python 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')
使用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)
使用Seaborn
进行绘制
sns.distplot(data['x'], hist=False, rug=True)
使用基础plot
data['x'].plot.density()
使用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) )
修改。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。
一种方法是编译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'])