在python中使用'violin-plot'样式图绘制一组函数

时间:2019-04-28 02:31:10

标签: python matplotlib seaborn

假设我要为f[n] = e^{-(x-n)^2}/n可视化功能n=1...10。请注意,这些不是概率分布。

(实际上不是我想做的情节,但足够接近)。

我想用小提琴图(https://matplotlib.org/gallery/statistics/violinplot.html)来演示它,其中每个n都有一条垂直线,并在垂直线的两侧绘制函数。

但是小提琴图似乎仅用于显示数据样本的位置。因此,所有用于它的工具都需要我为其提供数据集。我要绘制的数据不是该类型的-它是实际的已知函数。

[[如果您想获得更多背景信息,这与我的早先问题-https://stats.stackexchange.com/questions/403359/visualizing-2d-data-when-one-dimension-is-discrete-and-the-other-continuous]有关。

2 个答案:

答案 0 :(得分:1)

这个问题有点笼统,所以也许这实际上并不是您想要的。但是据我了解,您只想在位置f(x,n)上的不同位置n上绘制函数,并在垂直轴上绘制x

import numpy as np
import matplotlib.pyplot as plt

f = lambda x, n: np.exp(-(x-n)**2)/n

x = np.linspace(-2,12,101)
ns = np.arange(1,11)

for n in ns:
    plt.fill_betweenx(x, -f(x,n)+n, f(x,n)+n, color="C0", alpha=0.5)

plt.xlabel("n")
plt.ylabel("x")
plt.xticks(ns)        
plt.show() 

enter image description here

答案 1 :(得分:0)

IIUC,您想要这样的东西:

df = pd.DataFrame({n: [np.exp(-(x-n)**2)/n  for x in np.arange(-1,1,0.1)] for n in range(1,11)})

fig, ax = plt.subplots(1,1, figsize=(10,10))
ax.violinplot(df.T)
plt.show()

输出:

enter image description here