Можно ли установить выключенный цвет для пунктирной линии Matplotlib? - PullRequest
4 голосов
/ 02 декабря 2019

Использование пунктирных линий приятно, поскольку дает возможность различать линии, которые не зависят от способности читателя воспринимать различия в цвете. Проблема в том, что они работают, только если все детали линии больше, чем штрих-рисунок. В документации для функции Matplotlib Axes.plot описано, как настроить цвет линии (с ключевым словом color) и как настроить шаблон штрихов (ключевое слово dash). Есть ли способ заставить график чередоваться между двумя различными выбираемыми цветами вместо «там» и «нет» с помощью одного вызова Axes.plot?

Я могу добиться этого эффекта, построив одну и ту же линию дважды,один раз сплошной линией, а затем наложив те же данные пунктирной линией, но это усложняет управление альфа-прозрачностью (полупрозрачные линии желательны, когда на одном графике имеется несколько пересекающихся линий). Черные и серые линии на графике ниже были сгенерированы с помощью следующих строк кода:

ax.plot(xv1, yv1, marker="None", linestyle="-", color=(0.8, 0.8, 0.8, 1.0))
ax.plot(xv1, yv1, marker="None", linestyle="--", color=(0.0, 0.0, 0.0, 1.0))

Редактировать: Еще одна причина желать, чтобы это можно было выполнить с помощью одного вызова Axis.plot, заключается в том, что он будет отображатьПример строки правильно при создании легенды (единственный оставшийся недостаток, который я нашел в методах, приведенных в ответах).

Example of a plot with alternating color dashed lines.

Ответы [ 2 ]

3 голосов
/ 02 декабря 2019

Немного поэкспериментировав с красивым ответом @ WilliamMiller, его можно расширить до двух цветов:

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, np.pi*4, 100)
y = np.sin(x+np.pi/2)
z = np.sin(x+np.pi/4)
w = np.sin(x)

plt.plot(x, y, linestyle=(0, (5, 5)), color='gold')
plt.plot(x, y, linestyle=(5, (5, 5)), color='crimson')

plt.plot(x, z, linestyle=(0, (10, 30)), color='blueviolet')
plt.plot(x, z, linestyle=(10, (10, 30)), color='lime')
plt.plot(x, z, linestyle=(20, (10, 30)), color='fuchsia')
plt.plot(x, z, linestyle=(30, (10, 30)), color='coral')

plt.plot(x, w, linestyle=(0, (10, 20)), color='crimson', lw=3)
plt.plot(x, w, linestyle=(10, (10, 20)), color='lime', lw=3)
plt.plot(x, w, linestyle=(20, (10, 20)), color='deepskyblue', lw=3)

plt.show()

resulting plot

3 голосов
/ 02 декабря 2019

Это не выполняет то, что вы просите " с помощью одного вызова Axes.plot", но желаемое поведение может быть создано с помощью двух пользовательских linestyles -одна из которых смещена на ширину другой черты.

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0, np.pi*4, 100)
y = np.sin(x)

plt.plot(x, y, linestyle=(0, (2, 2)))
plt.plot(x, y, linestyle=(2, (2, 2)))
plt.show()

enter image description here

Спецификация linestyle равна (offset, (on_off_seq)), где on_off_seqtuple из одного или нескольких значений в pt с.

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