使用两个不同的彩色数据集创建matplotlib热图 [英] Creating a matplotlib heatmap with two different coloured data sets

查看:135
本文介绍了使用两个不同的彩色数据集创建matplotlib热图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前有两个大数据集,我想对它们进行比较.我将它们分别分开,一个为红色,另一个为蓝色,但是我想并排显示红色和蓝色.我该怎么办?

I currently have two large data sets, and I want to compare them. I have them separately, one in red and one in blue, however I would like to show the red and blue side by side. How might I go about this?

我当前的代码是:

column_labels = list(heatmap_ylabels)
row_labels = list(heatmap_xlabels)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data, cmap=plt.cm.Reds)

ax.set_xticks(np.arange(9+0.5))
ax.set_yticks(np.arange(140+0.5))

ax.invert_yaxis()
ax.xaxis.tick_top()
ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(column_labels, minor=False)
#plt.show()
plt.savefig('n1_heatmap')
plt.clf()

column_labels = list(heatmap_ylabels)
row_labels = list(heatmap_xlabels)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data1, cmap=plt.cm.Blues)

ax.set_xticks(np.arange(9+0.5))
ax.set_yticks(np.arange(140+0.5))

ax.invert_yaxis()
ax.xaxis.tick_top()
ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(column_labels, minor=False)
plt.savefig('n2_heatmap')
plt.clf()

datadata1都是由140个不同的列表组成,并从280个不同的文件中提取信息,有一种方法我仍然可以使用这两个列表来创建一个热图,该图将在相同的位置显示这些数据图?

Both data and data1 are formed of 140 different lists with information extracted from 280 different files, is there a way I can still use these two lists in order to create a heatmap which will show these data in the same figure?

例如,我的热图将是/red/blue/red/blue等

So for example my heatmap will be /red/blue/red/blue etc

这是我的热图示例:

虽然没有完全显示我想要的内容,但我对前两个热图之间的值差做了一个热图.

While not showing exactly what I want, I have made a heatmap of the difference in values between the two previous heatmaps.

例如:y2 = np.subtract(y, y1)

data2.append(y2)
column_labels = list(heatmap_ylabels)
row_labels = list(heatmap_xlabels)
fig, ax = plt.subplots()
heatmap = ax.pcolor(data2, cmap=plt.cm.bwr)

ax.set_xticks(np.arange(9+0.5))
ax.set_yticks(np.arange(140+0.5))

ax.invert_yaxis()
ax.xaxis.tick_top()
ax.set_xticklabels(row_labels, minor=False)
ax.set_yticklabels(column_labels, minor=False)
plt.savefig('diff_heatmap')
plt.clf()

推荐答案

正如@jeanrjc所述,从概念上讲,它与

As @jeanrjc mentioned, this is conceptually very similar to a a previously-asked question. However, it's probably not obvious how to apply that method in your case.

这是一个最小的示例,该示例以两个不同的颜色图并排"绘制具有相同形状的两个数组.关键是要独立绘制两个蒙版阵列.要创建这些屏蔽的数组,我们将使用列数加倍的新数组,并屏蔽每隔一列.

Here's a minimal example of plotting two arrays with the same shape "side-by-side" with two different colormaps. The key is to independently plot two masked arrays. To create these masked arrays, we'll make new arrays with double the number of columns and mask every other column.

这是一个简单的示例(请注意,有几种方法可以创建掩码数组模式):

Here's a simple example (note that there are several ways to create the masked array pattern):

import numpy as np
import matplotlib.pyplot as plt

# Generate data
nrows, ncols = 20, 5
x = np.random.random((nrows, ncols))
y = np.random.random((nrows, ncols))

# Make data for display
mask = np.array(nrows * [ncols * [False, True]], dtype=bool)
red = np.ma.masked_where(mask, np.repeat(x, 2, axis=1))

mask = np.array(nrows * [ncols * [True, False]], dtype=bool)
blue = np.ma.masked_where(mask, np.repeat(y, 2, axis=1))

# Make a side-by-side plot
fig, ax = plt.subplots()
ax.pcolormesh(red, cmap='Reds')
ax.pcolormesh(blue, cmap='Blues')
plt.show()

如果我们想制作一个更好的版本,我们可以做类似的事情:

And if we wanted to make a fancier version, we could do something similar to:

import numpy as np
import matplotlib.pyplot as plt

# Generate data
nrows, ncols = 20, 5
x = np.exp(np.random.normal(0, 0.8, (nrows, ncols)))
y = np.exp(np.random.normal(0, 1, (nrows, ncols)))

# Make data for display
mask = np.array(nrows * [ncols * [False, True]], dtype=bool)
red = np.ma.masked_where(mask, np.repeat(x, 2, axis=1))

mask = np.array(nrows * [ncols * [True, False]], dtype=bool)
blue = np.ma.masked_where(mask, np.repeat(y, 2, axis=1))

# Make a side-by-side plot
fig, ax = plt.subplots()
redmesh = ax.pcolormesh(red, cmap='Reds')
bluemesh = ax.pcolormesh(blue, cmap='Blues')

# Make things a touch fancier
ax.set(xticks=np.arange(1, 2 * ncols, 2),
       yticks=np.arange(nrows) + 0.5,
       xticklabels=['Column ' + letter for letter in 'ABCDE'],
       yticklabels=['Row {}'.format(i+1) for i in range(nrows)])

ax.set_title('Side-by-Side Plot', y=1.07)
ax.xaxis.tick_top()
ax.yaxis.tick_left()
ax.tick_params(direction='out')

# Add dual colorbars
fig.subplots_adjust(bottom=0.05, right=0.78, top=0.88)
cbar = fig.colorbar(redmesh, cax=fig.add_axes([0.81, 0.05, 0.04, 0.83]))
cbar.ax.text(0.55, 0.1, 'Variable 1', rotation=90, ha='center', va='center',
             transform=cbar.ax.transAxes, color='gray')
cbar = fig.colorbar(bluemesh, cax=fig.add_axes([0.9, 0.05, 0.04, 0.83]))
cbar.ax.text(0.55, 0.1, 'Variable 2', rotation=90, ha='center', va='center',
             transform=cbar.ax.transAxes, color='gray')

# Make the grouping clearer
ax.set_xticks(np.arange(0, 2 * ncols, 2), minor=True)
ax.grid(axis='x', ls='-', color='gray', which='minor')
ax.grid(axis='y', ls=':', color='gray')

plt.show()

这篇关于使用两个不同的彩色数据集创建matplotlib热图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆