Нарисуйте границу вокруг линии matplotlib - PullRequest
0 голосов
/ 18 мая 2018

Есть ли правильный способ нарисовать границу, чтобы очертить сюжет matplotlib?

Лучшее, что я нашел до сих пор, это ответ [ 1 ] и учебник по matplotlib [ 2 ], которые используют matplotlib.patheffects, чтобы нарисовать немного более толстый штрих для контура.

Моя проблема, однако, заключается в том, что он разбивает полупрозрачные графики, если вы установите alpha < 1.0, вы увидите полный ходза основным, пока я бы хотел настоящую границу.Есть ли способ нарисовать реальный контур?

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patheffects as mpe

outline=mpe.withStroke(linewidth=8, foreground='black')

x = np.linspace(0, 2*np.pi, 1000)

plt.plot(x, np.sin(x), lw=5, color='red', path_effects=[outline],
         label="stroke no alpha")

plt.plot(x, np.sin(x-np.pi/3.), lw=5, alpha=0.5, color='red', path_effects=[outline],
         label="stroke with alpha")

plt.plot(x, np.sin(x-2*np.pi/3.), lw=5, alpha=0.5, color='red',
         label="no stroke with alpha")

plt.legend()
plt.show()

enter image description here

1 Ответ

0 голосов
/ 19 мая 2018

Существует один способ нарисовать истинную границу, используя альфа, в том смысле, что более толстая черная линия не будет видна под красной линией.Хитрость заключается в том, чтобы построить белую линию, покрывающую нежелательную часть черной линии, чтобы оставить только границу.

Таким образом, вместо этого «штрих с альфа» будет выглядеть так:

pe1 = [mpe.Stroke(linewidth=8, foreground='black'),
       mpe.Stroke(foreground='white',alpha=1),
       mpe.Normal()]

plt.plot(x, np.sin(x-np.pi/3.), color='red', label="stroke with alpha", lw=5, 
alpha=0.5, path_effects=pe1)

Что дает следующий график:

stroke

Как видно, это решает проблему цветовых различий между наличием границы и отсутствием ее, но мешает видеть строки ниже.

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

pe1 = [mpe.Stroke(linewidth=8, foreground='black'),
       mpe.Stroke(foreground='white',alpha=0.6),
       mpe.Normal()]

приводит к:

strokes alpha

, который находится на полпути между розоватым цветом, полученным в результате объединениякрасный и альфа 0.5, и видя полностью черную линию внизу;все еще позволяя видеть другие линии, нанесенные ранее.

...