Как наложить несколько гистограмм со смещением xy - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь наложить несколько гистограмм и сдвинуть каждую по оси xy.Пока я создаю отдельные графики и использую иллюстратор для разработки окончательного варианта, однако я бы хотел сделать все в своем сценарии.Пытался долго и не увенчался успехом.Я подготовил небольшой текстовый кейс.Это не имеет особого смысла для этого набора данных, но для моих данных это довольно хорошее решение.Был бы очень рад, если кто-то может помочь.Спасибо

Вот пример кода, который генерирует наложенные гистограммы.

import random
import numpy
import matplotlib.pyplot as plt
%matplotlib inline

data1 = [random.gauss(3,2) for _ in range(400)]
data2 = [random.gauss(4,2) for _ in range(400)]
data3 = [random.gauss(5,2) for _ in range(400)]

bins = numpy.linspace(-10, 10, 100)

plt.xlim(0, 10)
plt.ylim(0, 25)

plt.hist(data3, bins, label='data3')
plt.hist(data2, bins, label='data2')
plt.hist(data1, bins, label='data1')
plt.legend(loc='upper right')
plt.savefig("trial01.pdf", transparent=True)

Overlaid Histograms

Однако рисунок, который я хочу, похож на этот

Expected Histogram Figure

1 Ответ

0 голосов
/ 20 декабря 2018

Вы, вероятно, хотите сдвинуть целые оси со своим содержимым.Для этого потребуется построить каждую гистограмму по своим осям, разделить оси и установить положение соответствующих осей (ax.set_position).Затем вы можете отключить галочки, шипы и ярлыки, где это необходимо.

import random
import numpy
import matplotlib.pyplot as plt
from matplotlib.transforms import Bbox

data1 = [random.gauss(3,2) for _ in range(400)]
data2 = [random.gauss(4,2) for _ in range(400)]
data3 = [random.gauss(5,2) for _ in range(400)]

bins = numpy.linspace(-10, 10, 100)

fig, ax1 = plt.subplots()

ax2 = fig.add_subplot(111, sharex=ax1, sharey=ax1, label="ax2")
ax3 = fig.add_subplot(111, sharex=ax1, sharey=ax1, label="ax3")

ax1.set(xlim=(0, 10), ylim=(0, 25))

ax1.hist(data3, bins, label='data3', color="C2")
ax2.hist(data2, bins, label='data2', color="C1")
ax3.hist(data1, bins, label='data1', color="C0")
fig.legend(loc='upper right')


xshift=0.04; yshift=0.04
for i, ax in enumerate((ax3,ax2,ax1)):
    ax.patch.set_visible(False)
    pos = ax.get_position()
    newpos = Bbox.from_bounds(pos.x0+i*xshift, pos.y0+i*yshift, pos.width, pos.height)
    ax.set_position(newpos)
    for sp in ["top", "right"]:
        ax.spines[sp].set_visible(False)

    if ax != ax3:
        ax.spines["left"].set_visible(False)
        ax.tick_params(labelleft=False, left=False, labelbottom=False)

fig.savefig("trial01.pdf", transparent=True)
plt.show()

enter image description here

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