Я попробовал обе настройки, указанные в других комментариях, а именно
cbar.solids.set_rasterized(True)
cbar.solids.set_edgecolor("face")
и, к сожалению, ни один из них не работал для меня.
Поэтому я попробовал совершенно другой подход, который представляет собой огромный хак, но, по крайней мере, выполняет свою работу. Когда вы передаете alpha
в imshow
, он устанавливает альфа-значение, которое будет использоваться для смешивания с другими изображениями. Из-за более высокой мощности (как упоминал @mfra) это создает белые линии, которые мы так презираем. Ясно, что ключевым моментом является не передача альфа-значения в imshow
. Однако нам все еще нужно как-то создать цветовую полосу.
Таким образом, в качестве обходного пути мы можем сделать альфа-смешивание самостоятельно, прежде чем давать цветовые карты для imshow
. В качестве примера воспользуемся цветовой картой winter
:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
xx, yy = np.meshgrid(np.linspace(-1, 1, 100), np.linspace(-1, 1, 100))
zz = xx**2 + yy**2
my_cmap_rgb = plt.get_cmap('winter')(np.arange(256))
alpha = 0.5
for i in range(3): # Do not include the last column!
my_cmap_rgb[:,i] = (1 - alpha) + alpha*my_cmap_rgb[:,i]
my_cmap = mpl.colors.ListedColormap(my_cmap_rgb, name='my_cmap')
Здесь я создаю новую цветовую карту my_cmap_rgb
на основе winter
, а затем редактирую не-альфа-каналы (0, 1 и 2), чтобы самостоятельно выполнить альфа-смешивание. Затем я могу просто использовать эту новую карту цветов для построения своей фигуры.
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap=my_cmap)
cbar = plt.colorbar(cim)
ax.set_title("No lines and no transparency")
Теперь сравните его с изображением, которое вы бы получили без этого трюка:
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap='winter', alpha=0.5)
cbar = plt.colorbar(cim)
ax.set_title("Lines and transparency")
![Линии и прозрачность](https://i.stack.imgur.com/Y3uAM.png)
Ясно, что проблема решена, если вам не нужна прозрачность. С другой стороны, если вам нужна прозрачность, есть еще один обходной путь. Вы должны сначала построить изображение без прозрачности, чтобы получить цветовую полосу, а затем построить изображение с прозрачностью, но чья цветовая полоса не будет использоваться.
f, ax = plt.subplots()
cim = ax.imshow(zz, cmap=my_cmap)
cbar = plt.colorbar(cim)
plt.cla() # Clears axis
ax.plot(50,50, 'ko')
ax.imshow(zz, cmap='winter', alpha=0.5)
ax.set_title("No lines and transparency")
Это приводит к изображению, цветовая полоса которого не имеет линий, но при этом сохраняет прозрачность. Хотя это остается массовым взломом, по крайней мере, нам больше не нужно мириться с этими строками!
![Никаких линий и прозрачности](https://i.stack.imgur.com/w8ez3.png)
person
cako
schedule
27.02.2016