Выровняйте линейный график по xticks на двухосном графике с тепловой картой - PullRequest
0 голосов
/ 12 октября 2018

Я пытаюсь построить линейный график и тепловую карту на графике с двумя осями.Вот что я получаю:

enter image description here

Как видите, линейный график не выровнен с пробелами из-за присутствиятепловая карта, которая центрирует xticks.Как я могу сдвинуть линейный график вправо на 0,5, чтобы точки данных на линейном графике правильно соответствовали символам?

Ниже мой код:

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

data1 = np.random.random((10, 10))
data2 = np.random.random((10))

f, ax = plt.subplots(figsize=(11, 9))
plt.tick_params(bottom='on')
ax = sns.heatmap(data1, cmap=sns.color_palette("Greens", 5))
ax2 = plt.twinx()
sns.lineplot(data=data2, linewidth=5, ax=ax2)
ax.axis('tight')

plt.show()

Ответы [ 2 ]

0 голосов
/ 12 октября 2018

Проблема не в линейном графике, а в тепловой карте, которая показывает тики в неправильных позициях [*].Вместо этого вы можете напрямую использовать сюжет matplotlib imshow, где все работает правильно.

import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np

data1 = np.random.random((10, 10))
data2 = np.random.random((10))

f, ax = plt.subplots(figsize=(11, 9))
plt.tick_params(bottom='on')

im = ax.imshow(data1, cmap=plt.get_cmap("Greens",5), aspect="auto")
f.colorbar(im)

ax2 = plt.twinx()
sns.lineplot(data=data2, linewidth=5, ax=ax2)
ax.axis('tight')

plt.show()

enter image description here


[*] По "неправильной позиции"Я имею в виду, что галочки не появляются в той позиции на осях, которую они, похоже, обозначают.Т.е. единицы измерения тиков не идентичны значениям, показанным на этикетках.

В случае, если тепловая карта отображается на ax, печать

print(*ax.get_xticklabels())

приводит к

Text(0.5, 0, '0') Text(1.5, 0, '1') Text(2.5, 0, '2') Text(3.5, 0, '3') Text(4.5, 0, '4') Text(5.5, 0, '5') Text(6.5, 0, '6') Text(7.5, 0, '7') Text(8.5, 0, '8') Text(9.5, 0, '9')

Здесь вы можете видеть, что первая метка помечена позицией x=0.5, но показывает '0' в качестве метки.Т.е. все позиции смещены на 0,5 по сравнению с их метками.

В случае графика imshow (после рисования графика f.canvas.draw()) напечатанные метки имеют размер

Text(-2.0, 0, '-2') Text(0.0, 0, '0') Text(2.0, 0, '2') Text(4.0, 0, '4') Text(6.0, 0, '6') Text(8.0, 0, '8') Text(10.0, 0, '10')

Здесь метки и позиции совпадают.

0 голосов
/ 12 октября 2018

Ниже приведен один из способов сделать это.

Пояснение : Экземпляр с двойной осью ax2 имеет только одну линию, построенную с использованием sns.lineplot.Сначала вы извлекаете этот line объект.Затем вы просто обновляете (смещаете) x-данные этой строки вправо на 0.5, как вы хотели.line.get_xdata() возвращает вам массив значений x, и вы просто добавляете 0.5 векторизованным способом, а затем применяете изменения, используя line.set_xdata.Добавьте следующие строки после вашей команды sns.lineplot().

line = ax2.lines[0] # get the line
line.set_xdata(line.get_xdata() + 0.5)

enter image description here

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