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

标签 python plotly

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

具体来说,我想针对某些标准密度执行此操作。

<小时/>

更新:

到目前为止,实现我要求的最佳方法(在 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

最佳答案

下面的代码使用gaussian_kde 。这些绘图位于 iplot()plotly 以及 matplotlibseaborn 中。将它们放在一起进行比较。 (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

使用基本绘图

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

关于python - 如何使用plotly绘制标准密度曲线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51296001/

相关文章:

r - 在 R 中使用 Plotly 进行子图

python - 如何将 self 对象传递给全局变量(Django View )

r - 根据 selectInput 更改绘图图表 y 变量

python - 使用绘图对象创建显示目录结构的树形图

python - LabelEncoder 将不同的值编码为相同的值

Python:如何从 mlpd3、Bokeh、Plotly 中的链接画笔获取数据?

r - 向 ggplotly 图中添加垂直线

Python协程: Release context manager when pausing

python - 计算字符串列表中的特定单个字母

python - 已安装 Mechanize,但 Python 找不到模块