Как я могу попросить matplotlib слегка изменить перекрывающиеся кривые, чтобы они не скрывали друг друга? - PullRequest
2 голосов
/ 16 апреля 2019

Я использую matplotlib.pyplot для построения нескольких кривых на одном графике. Иногда они имеют одинаковые значения, поэтому последний скрывает другие, например:

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([1,2,3,2.5], label="down")
plt.show()

hidden curve

Мне бы хотелось, чтобы кривые были слегка смещены, чтобы они не скрывали друг друга, например:

all curves visible

Есть ли какой-нибудь правильный способ сделать это, не изменяя фактические значения, которые я черчу?

Обновление: На данный момент лучший ответ (для моего случая) - это ответ ImportanceOfBeingErnest . Однако, если у меня есть n кривых для построения, а не только 2, мне придется вычислять накопленное смещение для каждой. Но, учитывая сложные вычисления, в которые входит этот ответ , я полагаю, у matplotlib нет способа сделать это автоматически?

PS: поскольку все мои значения кратны 0,5, (небольшое) смещение не рискует создать путаницу с фактическим значением ...

Ответы [ 5 ]

3 голосов
/ 16 апреля 2019

Полагаю, обычным способом перевода художника с размером в пунктах является использование matplotlib.transforms.offset_copy. Поскольку ширина линий по умолчанию составляет 1,5 точки, кривую можно перевести примерно на это число.

import matplotlib.pyplot as plt
import matplotlib.transforms as mtrans

fig, ax = plt.subplots()
ax.plot([1,2,3,4], label="up")

tr = mtrans.offset_copy(ax.transData, fig=fig, x=0.0, y=-1.5, units='points')
ax.plot([1,2,3,2.5], label="down", transform=tr)

plt.show()

enter image description here

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

2 голосов
/ 16 апреля 2019

Вы можете использовать альфа-атрибут.

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([1,2,3,2.5], label="down", alpha=.3)
plt.legend()
plt.show()

Измените соотношение между [0, 1], чтобы добиться наилучшего результата.Таким образом, вам не нужно менять свои значения.

Чтобы улучшить видимость, вы можете добавить атрибут "linewidth" с помощью "alpha".например,

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([1,2,3,2.5], label="down", linewidth=4, alpha=.5)
plt.legend()
plt.show()

Измените значения, как вам нравится.

1 голос
/ 16 апреля 2019

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

import matplotlib.pyplot as plt
from matplotlib import transforms

fig, ax = plt.subplots()

transform = transforms.Affine2D().translate(0, -0.03) + ax.transData

ax.plot([1, 2, 3, 4], label="up")
ax.plot([1, 2, 3, 2.5], label="down", transform=transform)

enter image description here

0 голосов
/ 16 апреля 2019

Другим вариантом будет использование пунктирной линии с более темным цветом, который перекрывается.

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], color="red", label="up", lw=2)
plt.plot([1,2,3,2.5], color="black", linestyle=":", label="down", lw=2)

enter image description here

0 голосов
/ 16 апреля 2019

Вы можете просто масштабировать значения

import matplotlib.pyplot as plt
plt.figure()
plt.plot([1,2,3,4], label="up")
plt.plot([x-0.02 for x in [1,2,3,2.5]], label="down")
plt.legend()
plt.show()

output

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