假设我使用下面的代码绘制一个图。如何在x轴的上边缘绘制地毯部分?
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
sns.distplot(np.random.normal(0, 0.1, 100), rug=True, hist=False)
plt.show()
答案 0 :(得分:1)
seaborn.rugplot
创建一个LineCollection
,其线的长度在轴坐标中定义。它们始终是相同的,因此如果您反转轴,则图不会改变。
不过,您可以根据数据创建自己的LineCollection
。与使用bar
相比,优点是线宽以磅为单位,因此不会因数据范围而丢失线。
import numpy as np; np.random.seed(42)
import matplotlib.pyplot as plt
import seaborn as sns
def upper_rugplot(data, height=.05, ax=None, **kwargs):
from matplotlib.collections import LineCollection
ax = ax or plt.gca()
kwargs.setdefault("linewidth", 1)
segs = np.stack((np.c_[data, data],
np.c_[np.ones_like(data), np.ones_like(data)-height]),
axis=-1)
lc = LineCollection(segs, transform=ax.get_xaxis_transform(), **kwargs)
ax.add_collection(lc)
fig, ax = plt.subplots()
data = np.random.normal(0, 0.1, 100)
sns.distplot(data, rug=False, hist=False, ax=ax)
upper_rugplot(data, ax=ax)
plt.show()
答案 1 :(得分:0)
Rugs只是数据点上的细线。可以将它们视为细棒。话虽如此,您可以通过以下方法解决:在没有地毯的情况下绘制distplot
,然后创建一个双x轴并绘制带有细条的条形图。以下是一个有效的答案:
import numpy as np; np.random.seed(21)
import matplotlib.pyplot as plt
import seaborn as sns
fig, ax = plt.subplots()
data = np.random.normal(0, 0.1, 100)
sns.distplot(data, rug=False, hist=False, ax=ax)
ax1 = ax.twinx()
ax1.bar(data, height=0.3, width=0.001)
ax1.set_ylim(ax.get_ylim())
ax1.invert_yaxis()
ax1.set_yticks([])
plt.show()