Как бороться с «пикселизацией» перекрывающихся кривых в Matplotlib - PullRequest
0 голосов
/ 15 ноября 2018

У меня следующая проблема: когда я строю две или более кривых (с одинаковой шириной линии), они выглядят «пикселизированными» в тех областях, где они перекрываются.Вот пример:

x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape) 
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])

fig, ax = plt.subplots(1, 1, figsize=(3,3))
ax.plot(x, y1, lw=4, color='k')
ax.plot(x, y2, lw=4, color='yellow')
plt.show()

enter image description here

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

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

1 Ответ

0 голосов
/ 15 ноября 2018

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

Для plot это может выглядеть как

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(0, np.pi, 100)
y1 = np.sin(x)
y2 = np.zeros(x.shape) 
y2[:51] = np.sin(x[:51])
y2[51:] = 2 - np.sin(x[51:])

fig, axes = plt.subplots(1,2, figsize=(6,3))
for aa, ax in zip([True, False], axes.flat):
    ax.plot(x, y1, lw=4, color='k', antialiased=aa)
    ax.plot(x, y2, lw=4, color='yellow', antialiased=aa)
plt.show()

enter image description here

Как следствие, когда сглаживание отключено, пиксель либо занят соответствующим цветом линии, либо нет.

...