Matplotlib / Seaborn: как построить график на верхнем краю оси X? - PullRequest
1 голос
/ 08 марта 2019

Предположим, я рисую график, используя код ниже. Как нанести часть коврика на верхний край оси 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()

enter image description here

Ответы [ 2 ]

1 голос
/ 08 марта 2019

seaborn.rugplot создает LineCollection с длиной линий, определяемой в координатах осей. Они всегда одинаковы, так что график не меняется, если инвертировать оси.

Вы можете создать свой собственный LineCollection из данных, хотя. Преимущество по сравнению с использованием bar s состоит в том, что ширина линии указана в точках, и поэтому никакие линии не будут потеряны независимо от диапазона данных.

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()

enter image description here

0 голосов
/ 08 марта 2019

Коврики - это просто тонкие линии в точках данных.Йо может думать о них как о тонких столбиках.Тем не менее, вы можете иметь следующую работу: построить график 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()

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...