如何使用hexbin和matplotlib将颜色淡化至透明?

4
我正在使用hexbin创建“热度图”,并希望将此热度图放置在图像之上。但是,我希望图的颜色随着频率而逐渐变为透明(即当颜色变为白色时,它消失了)。我尝试过更改alpha值,但那不会产生所需的效果。
我的代码如下:
n = 100000
x = np.random.standard_normal(n)
img = imread("soccer.jpg")
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n)
plt.hexbin(x,y, bins='log', cmap=plt.cm.Reds, alpha = 0.3)
plt.imshow(img,zorder=0, extent=[-10, 10, -20, 20])
#plt.show()
plt.savefig('map.png') 

我可以使用2D直方图或任何其他绘图函数。即使在那个六边形中没有值时也能透明显示,因为我的许多区域都没有数据点。

目前代码生成的图像如下:

热力图图像


2
你尝试使用过使用alpha通道的colormap吗?我想不到内置的一个,但我为相关问题创建了一个colormap。也就是说,我会尝试使用一个将小值绘制成低alpha颜色和高值绘制成具有高alpha的鲜明颜色的colormap。 - cphlewis
那听起来像是我在寻找的答案类型,但我对于颜色方案并不了解。我一定会尝试一下。谢谢! - rkruse
那个示例中的颜色映射将是我称之为“dropout_high”的映射,除非您可能想要删除低值。您将编辑它所制作的字典的alpha部分。 - cphlewis
1个回答

4

以下是一个简单的示例:

n = 100000
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.colors import LinearSegmentedColormap


x = np.random.standard_normal(n)
img = plt.imread("soccer.jpg")
y = 2.0 + 3.0 * x + 4.0 * np.random.standard_normal(n)

red_high = ((0., 0., 0.),
         (.3, .5, 0.5),
         (1., 1., 1.))

blue_middle = ((0., .2, .2),
         (.3, .5, .5),
         (.8, .2, .2),
         (1., .1, .1))

green_none = ((0,0,0),(1,0,0))

cdict3 = {'red':  red_high,

     'green': green_none,

     'blue': blue_middle,

     'alpha': ((0.0, 0.0, 0.0),
               (0.3, 0.5, 0.5),
               (1.0, 1.0, 1.0))
    }


dropout_high = LinearSegmentedColormap('Dropout', cdict3)
plt.register_cmap(cmap = dropout_high)

plt.hexbin(x,y, bins='log', cmap=dropout_high)
plt.imshow(img,zorder=0, extent=[-10, 10, -20, 20])
plt.show()
#plt.savefig('map.png') 

在此输入图片描述

(很抱歉,我的足球场是横着的。我通常会像它一样打。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接