Создайте 2x2 сетку тепловых карт морского зигзага с общими осями - PullRequest
0 голосов
/ 05 июня 2018

Я хочу создать сетку тепловых карт морского происхождения 2 x 2 из кадра данных pandas в python, но у меня возникают проблемы с получением желаемого результата.В настоящее время этот код ...

import numpy as np
import pandas as pd
import seaborn as sns

df = pd.DataFrame({'x': np.random.uniform(0, 100, 1000), 
                   'y': np.random.uniform(0, 100, 1000), 
                   'z1': np.random.uniform(0, 1, 1000),
                   'z2': np.random.uniform(0, 1, 1000),
                   'z3': np.random.uniform(0, 1, 1000),
                   'z4': np.random.uniform(0, 1, 1000)})

fig,axn = plt.subplots(2, 2, sharex=True, sharey=True)
result0 = df.pivot(index='x', columns='y', values='z1')
result1 = df.pivot(index='x', columns='y', values='z2')
result2 = df.pivot(index='x', columns='y', values='z3')
result3 = df.pivot(index='x', columns='y', values='z4')

plt.subplot(2, 2, 1)
sns.heatmap(result0, annot=False, cmap='RdBu_r')
plt.subplot(2, 2, 2)
sns.heatmap(result1, annot=False, cmap='RdBu_r')
plt.subplot(2, 2, 3)
sns.heatmap(result2, annot=False, cmap='RdBu_r')        
plt.subplot(2, 2, 4)
sns.heatmap(result3, annot=False, cmap='RdBu_r') 

создает график, который выглядит следующим образом ... enter image description here

Но я хочу добавить следующие функции:

  • Инвертировать каждую из осей y, чтобы 0 находился внизу, а 100 - вверху
  • Сетка должна иметь общие оси x и y, чтобы отметки былине отображается без необходимости
  • Тики по оси Y и X должны быть целыми числами, а не десятичными (несмотря на то, что серия y является плавающей точкой
  • Каждая сетка должна иметь отдельный заголовок
  • Цветная полоса должна быть общей для всех диаграмм.

Эти примеры данных на самом деле не отражают тепловую карту, но я не могу найти лучший способ для них. Любая помощь в решении пяти пунктов выше будетс благодарностью. Спасибо!

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Для данных, которые у вас есть, hexbin имеет больше смысла, чем heatmap.Это решение использует ImageGrid для выполнения большинства требований вполне естественно.Обратите внимание, что я передаю конкретные значения для максимального и минимального значений, чтобы цветовая панель работала правильно.

from mpl_toolkits.axes_grid1 import ImageGrid

fig = plt.figure()
grid = ImageGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=0.3, cbar_mode='single')

for ax, col in zip(grid, ['z1', 'z2', 'z3', 'z4']):
    hb = ax.hexbin(df.x, df.y, C=df[col], cmap='RdBu_r', vmin=0, vmax=1)
    ax.set_title(col)
    ax.set_xlabel('x')
    ax.set_ylabel('y')

grid.cbar_axes[0].colorbar(hb)

sample hexbin

0 голосов
/ 08 июня 2018

Вы можете играть с параметрами xticklabels, yticklabels, cbar.

fig,axn = plt.subplots(2, 2, sharex=True, sharey=True, figsize=(6, 6))
xticks = ['{0:.0%}'.format(i/1000) if i % 100 == 0 else '' for i in range(1000)]
yticks = ['{0:.0%}'.format(i/1000) if i % 100 == 0 else '' for i in range(999, 0, -1)]
ax = plt.subplot(2, 2, 1)
cbar_ax = fig.add_axes([.91, .3, .03, .4])

sns.heatmap(
    result0.iloc[-1::-1, -1::-1], annot=False, cmap='RdBu_r',
    xticklabels=False, yticklabels=yticks, cbar=False, ax=ax)
ax.set_title('Title 1')
ax.set_aspect('equal')

ax = plt.subplot(2, 2, 2)
sns.heatmap(
    result1.iloc[-1::-1, -1::-1], annot=False, cmap='RdBu_r',
    xticklabels=False, yticklabels=False, cbar=False, ax=ax)
ax.set_title('Title 2')
ax.set_aspect('equal')

ax = plt.subplot(2, 2, 3)
sns.heatmap(
    result2.iloc[-1::-1, -1::-1], annot=False, cmap='RdBu_r',
    xticklabels=xticks, yticklabels=yticks, cbar=False, ax=ax)
ax.set_title('Title 3')
ax.set_aspect('equal')

ax = plt.subplot(2, 2, 4)
sns.heatmap(
    result3.iloc[-1::-1, -1::-1], annot=False, cmap='RdBu_r',
    xticklabels=xticks, yticklabels=False, cbar=True, cbar_ax=cbar_ax, ax=ax)
ax.set_title('Title 4')
ax.set_aspect('equal')
fig.tight_layout(rect=[0, 0, .9, 1])

Ссылки

Одна цветовая шкала для тепловых карт морского побережьяв субплоте

Как мне установить соотношение сторон в matplotlib?

enter image description here

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