matplotlib - построение двух гистограмм на одной оси с перекрывающимися галочками x / y - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь построить гистограммы по нескольким осям моего графика. Мой скрипт ниже делает это, но я просто не могу стандартизировать тики x / y для каждого ax, то есть без наложения, общий диапазон интервалов для каждого топора.

Я хочу указать тики x / y для каждого ax вместо установки глобальных тиков для всего графика.

Вывод, который у меня пока есть, тоже ниже. Как вы можете видеть, галочки перепутаны, особенно в последнем ax. Я пробовал ax_set_x / yticks, plt.x / yticks .... но я почти уверен, что что-то не так делаю. Большое спасибо!! enter image description here

Сценарий:

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

data = np.random.normal(0.0005, 0.001,1000)
data2 = np.random.normal(0.0004, 0.001,1000)-data
diff = {k:[data, data2] for k in range(3)}
for k in diff:
    print k
ttls= ['SC2 vs SC1', 'SC4 vs SC3','SC6 vs SC5']
colors = ['chocolate', 'green']
leg = ['var1', 'var2'] 
bins = 100
fig, axes = plt.subplots(nrows=3, ncols=1, figsize=(8.27, 11.69))
fig.add_subplot(111, frameon=False)
fig.suptitle('Normed Histograms', color='#6E6E6E', fontsize=10, fontweight='bold')
for ax, ttl, arr in zip(axes, ttls, diff.itervalues()):
    ax.hist((arr[0], arr[1]),bins, histtype='stepfilled', density=True, color=colors, label=leg, alpha=0.70)
    for i, v in enumerate(arr):
        mean = np.mean(v) 
        std = np.std(v)    
        xRange = np.linspace(np.min(v), np.max(v))#, len(cs))
        nd = ss.norm.pdf(xRange, mean, std)
        if  i == 0:
            socNd = ax.plot(xRange, nd, color='r', alpha=0.70, linewidth=0.8, label="fitted PDF*")
            socLine = ax.axvline(mean, color=colors[0], linestyle = ':',linewidth=2, label="Mean value")
        if i == 1:
            bcNd = ax.plot(xRange, nd, color='r', alpha=0.70, linewidth=0.8)
            bcLine = ax.axvline(mean, color=colors[1], linestyle = ':',linewidth=2)                 
    ax.set_title(ttl, loc='left', color='#6E6E6E', fontsize=8.5, fontweight='bold', pad=12)
    ax.set_ylabel("Frequency",  color='#6E6E6E', fontsize=8) 
    axes[2].legend(loc='lower center', bbox_to_anchor=(0.5, -0.5),ncol=4)
    axes[2].set_xlabel("xlabel", fontsize=8, labelpad=3)
plt.subplots_adjust(hspace=0.7)

plt.show()

1 Ответ

0 голосов
/ 11 января 2019

Вы создаете 3 субплота, используя fig, axes = plt.subplots(...), затем вы создаете еще один субплот поверх ваших существующих 3. Однако, поскольку вы установили frameon=False, отображаются только метки тиков и тиков (попробуйте удалить frameon=False и вы увидите проблему).

Решение состоит в том, чтобы просто удалить fig.add_subplot(111, frameon=False), чтобы не создавать дополнительный набор осей.

Полученный график для меня выглядит так:

enter image description here

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