如何在matplotlib中制作地毯图

9
我正在使用matplotlib创建密度图,并且我还想在其下方得到一个rug plot。这里有一个很好的制作密度图的示例(如何在matplotlib中创建密度图?),但是我无法找到任何关于rug plot的好例子,在R中可以轻松完成rug(data)。
4个回答

15

您可以在每个数据点处绘制标记。

from scipy import stats
import numpy as np
import matplotlib.pyplot as plt

sample = np.hstack((np.random.randn(30), np.random.randn(20)+5))
density = stats.kde.gaussian_kde(sample)

fig, ax = plt.subplots(figsize=(8,4))

x = np.arange(-6,12,0.1)
ax.plot(x, density(x))

ax.plot(sample, [0.01]*len(sample), '|', color='k')

在此输入图片描述


[0.01]*len(sample) 可能比 np.full_like(sample, 0.01) 更快(并且使用步幅技巧可能会更快)。 - Eric O. Lebigot
这似乎是目前最好的纯mpl答案,但我如何使标记(“|”)的底部与轴的底部对齐? - CPBL

4
您可以在这里找到一个示例!
ax = fig.add_subplot(111)

ax.plot(x1, np.zeros(x1.shape), 'b+', ms=20)  # rug plot
x_eval = np.linspace(-10, 10, num=200)
ax.plot(x_eval, kde1(x_eval), 'k-', label="Scott's Rule")
ax.plot(x_eval, kde1(x_eval), 'r-', label="Silverman's Rule")

似乎这就是它的核心!

1
在这里,np.zeros(x1.shape)比标准的np.zeros_like(x1)更直接。 - Eric O. Lebigot
一个更简单的方法,可以保持底部轴上的刻度线:ax.vlines(x1, ymin=0, ymax=0.01) - mforbes

4

您还可以使用Seaborn.distplot,它将直方图、KDE和地毯一起包装在一起。 Seaborn生成的图形默认情况下也更漂亮。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sample = np.hstack((np.random.randn(30), np.random.randn(20)+5))
fig, ax = plt.subplots(figsize=(8,4))
sns.distplot(sample, rug=True, hist=False, rug_kws={"color": "g"},
    kde_kws={"color": "k", "lw": 3})
plt.show()

enter image description here


1
请注意,如果您需要更多的控制,您也可以单独使用 seaborn.rugplot 函数:https://seaborn.pydata.org/generated/seaborn.rugplot.html - Avsecz

0

对于只是想在 matplotlib 轴上使用 rugplot 的人,这里有一个答案:你可以使用 seaborn 函数。

import seaborn as sns
sns.rugplot(xdata, height=0.025, axis=ax,  color='k')

这比纯matplotlib的修补要好看得多,因为地毯与x轴对齐。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接