我使用了一个色条工具,并且需要改变沿Y轴的任意范围的不透明度,而不是让不透明度值与 colored颜色 本身相关联.

在阅读SO和各种在线教程中的其他帖子时,我偶然看到一些帖子显示pColoresh、facecolor、edgecolor或在RGB colored颜色 定义中添加alpha值作为第四列,但它们都没有真正解决问题.

如果您运行下面的最小示例代码(使用之前来自SO的帮助,我很感激),您将看到由每种 colored颜色 定义的不透明度:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

XMIN        = 0.0
XMAX        = 1.0
YMIN        = 1000.0
YMAX        = 2000.0
RATIO       = 5.0
NUM_COLORS  = 256

color_list      = ([0.2, 0.88, 0.3, 0.25], [0.33, 1.0, 0.25, 0.15], [0.7, 0.2, 0.5, 1.0], [0.0, 0.34, 0.2, 0.1], [0.5, 0.9, 0.1, 1.0])  # RGBA, 0 to 1 plus opacity
bounds          = [YMIN, 1100.0, 1400.0, 1800.0, YMAX]
color_tuples    = [(i, color) for i, color in zip(np.interp(bounds, [bounds[0], bounds[-1]], [0, 1]), color_list)]
fig, ax         = plt.subplots(1, 1, figsize = (4, 10), num = "Variable opacity by Y?")
segm_cmap       = mpl.colors.LinearSegmentedColormap.from_list("Segm_cmap", color_tuples, N = NUM_COLORS)
norm            = plt.Normalize(vmin = bounds[0], vmax = bounds[-1])
img             = ax.imshow(np.linspace(YMIN, YMAX, NUM_COLORS).reshape(-1, 1), cmap = segm_cmap, norm = norm, interpolation = "bilinear",
                        origin = "lower", extent = [XMIN, XMAX, YMIN, YMAX])
ax.set_aspect((XMAX - XMIN) / (YMAX - YMIN) * RATIO)

plt.show()

然而,就像"bound"列表定义的 colored颜色 边界/渐变一样,我认为可以用x,y对和各自的不透明度创建一个类似的元组,并将其作为"pha"传递给imshow(),因为Matplotlib文档表明它接受2D数组等.类似于:

opacities = ([[XMIN to XMAX, YMIN to 1200], 1.0], [[XMIN to XMAX, 1200.1 to 1500], 0.5], [[XMIN to XMAX, 1500.1 to YMAX], 0.1])
img = ax.imshow(....., alpha = opacities)

即X范围、Y范围和不透明度值.但我无论如何也无法让它工作,我也找不到几个样例代码来指导我.所以我说,"为了正义,我必须go 找唐·科尔……",我的意思是,如果可能的话,我必须向聪明人寻求建议.供您参考,我有Python3.10.12和Matplotlib 3.5.1(Ubuntu 22.04,如果相关).

推荐答案

LinearSegmentedColormap平滑 colored颜色 (包括alpha值). 当imshow()alpha=参数是2D时,它需要具有与图像数据相同的元素数量. 对于您的用例,np.where()可用于从图像数据创建alpha.

下面的代码忽略原始 colored颜色 列表中给出的Alpha:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np

XMIN = 0.0
XMAX = 1.0
RATIO = 5.0
NUM_COLORS = 256

color_list = ([0.2, 0.88, 0.3, 0.25], [0.33, 1.0, 0.25, 0.15], [0.7, 0.2, 0.5, 1.0],
              [0.0, 0.34, 0.2, 0.1], [0.5, 0.9, 0.1, 1.0])  # RGBA, 0 to 1 plus opacity
color_list_rgb = [rgba[:3] for rgba in color_list]
bounds = [1000, 1100, 1400, 1800, 2000]
YMIN = bounds[0]
YMAX = bounds[-1]

color_tuples = [(i, color) for i, color in zip(np.interp(bounds, [bounds[0], bounds[-1]], [0, 1]), color_list_rgb)]

fig, (ax, ax1, ax2) = plt.subplots(1, 3, figsize=(10, 8))
segm_cmap = mpl.colors.LinearSegmentedColormap.from_list("Segm_cmap", color_tuples, N=NUM_COLORS)
norm = plt.Normalize(vmin=bounds[0], vmax=bounds[-1])
img_data = np.linspace(YMIN, YMAX, NUM_COLORS).reshape(-1, 1)
img_alpha = np.where(img_data <= 1200, 1, np.where(img_data <= 1500, 0.5, 0.1))
ax.imshow(img_data, cmap=segm_cmap, norm=norm, interpolation="bilinear",
          origin="lower", extent=[XMIN, XMAX, YMIN, YMAX], alpha=img_alpha)
ax.set_aspect((XMAX - XMIN) / (YMAX - YMIN) * RATIO)
ax.set_title('opacity via y')
ax.set_xticks([]) # remove x ticks

ax1.imshow(img_data, cmap=segm_cmap, norm=norm, interpolation="bilinear",
           origin="lower", extent=[XMIN, XMAX, YMIN, YMAX])
ax1.set_aspect((XMAX - XMIN) / (YMAX - YMIN) * RATIO)
ax1.set_title('without opacity')
ax1.set_xticks([])

ax2.hlines(bounds, 0, 1, lw=5, clip_on=False, colors=color_list_rgb)
ax2.set_xlim(XMIN, XMAX)
ax2.set_ylim(YMIN, YMAX)
ax2.set_aspect((XMAX - XMIN) / (YMAX - YMIN) * RATIO)
ax2.set_title('given colors')
for sp in ['top', 'bottom']:
    ax2.spines[sp].set_visible(False)  # hide upper and lower spine
ax2.set_xticks([])

plt.show()

2D alpha in imshow()

Python相关问答推荐

Django管理面板显示字段最大长度而不是字段名称

在Python中处理大量CSV文件中的数据

可变参数数量的重载类型(args或kwargs)

在Python中管理打开对话框

使用groupby Pandas的一些操作

Python键入协议默认值

删除字符串中第一次出现单词后的所有内容

Pandas:将多级列名改为一级

Asyncio:如何从子进程中读取stdout?

人口全部乱序 - Python—Matplotlib—映射

使用嵌套对象字段的Qdrant过滤

仅使用预先计算的排序获取排序元素

解决Geopandas和Altair中的正图和投影问题

当HTTP 201响应包含 Big Data 的POST请求时,应该是什么?  

当输入是字典时,`pandas. concat`如何工作?

Scipy差分进化:如何传递矩阵作为参数进行优化?

在round函数中使用列值

使用美汤对维基百科表格进行网络刮擦未返回任何内容

如何在不遇到IndexError的情况下将基数10的整数转换为基数80?

Django REST框架+Django Channel->;[Errno 111]连接调用失败(';127.0.0.1';,6379)