изменение «альфа» значения цвета лица дает нежелательные края (matplotlib pcolormesh) - PullRequest
0 голосов
/ 30 августа 2018

Мне нужно ввести непостоянное альфа-значение, используя pcolormesh (imshow априори не возможна, потому что мне нужно использовать логарифмический масштаб для осей - следовательно, нерегулярный интервал вдоль каждой координаты).

После этого поста я попытался апостериорно изменить альфа-значение граней. Однако в результате я не могу избавиться от краев, которые появляются.

Вот минимальный пример, где я строю двумерный гауссовский удар (с очень небольшим количеством точек), причем альфа увеличивается от нижнего левого до верхнего правого угла:

from matplotlib import pyplot as plt
import numpy as np

# start with coordinates, corresponding meshgrid to compute the "shading" value and 
# extended coordinate array for pcolormesh (center mesh)
xx = np.linspace(-4,4,7)
xmesh, ymesh = np.meshgrid(xx,xx)
xplot = np.pad(0.5*(xx[1:]+xx[:-1]),1,'reflect',reflect_type="odd") # center & extend
yy = np.exp(-xx[None,:]**2-xx[:,None]**2) # data to plot

# plot the data
fig = plt.figure()
hpc = plt.pcolormesh(xplot, xplot, yy, shading="flat", edgecolor=None)
plt.gca().set_aspect(1)

# change alpha of the faces: lower-left to upper-right  gradient
fig.canvas.draw()  # this generate face color array
colors = hpc.get_facecolor()
grad = ( (xmesh.ravel()+ymesh.ravel())/2. - xx.min() ) / ( xx.max()-xx.min() )
colors[:,3] = grad.ravel()  # change alpha
hpc.set_facecolor(colors)   # update face colors
fig.canvas.draw()           # make the modification appears

Результат выглядит следующим образом: двумерный гауссовский выпуклость (с очень небольшим количеством точек), причем альфа увеличивается от нижнего левого до верхнего правого угла: The result looks like this: 2D gaussian bump (with very few points), with alpha increasing from the lower left to the upper right corner

Можно ли избавиться от этих краев? Моя проблема в том, что я даже не знаю, откуда она взялась ... Я попытался добавить hpc.set_antialiased(True), hpc.set_rasterized(True), явно добавить ребра с помощью hpc.set_facecolor(face), настроить ширину линии на очень маленькие значения - ни одно из них не сработало.

Большое спасибо за вашу помощь

1 Ответ

0 голосов
/ 30 августа 2018

Проблема в том, что квадраты немного перекрывают друг друга, и они несколько прозрачны (вы устанавливаете их альфа-значения! = 1) - поэтому при перекрытиях они менее прозрачны, чем должны быть, и это выглядит как линия.

Вы можете исправить это, сделав квадраты непрозрачными, но с цветом, как если бы они имели указанную прозрачность, с белым фоном:

def alpha_to_white(color):
    white = np.array([1,1,1])
    alpha = color[-1]
    color = color[:-1]
    return alpha*color + (1 - alpha)*white

colors = np.array([alpha_to_white(color) for color in colors])

enter image description here

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