Мне было интересно, какой лучший способ сделать y-метку, где каждое слово на этикетке может быть другого цвета.Matplotlib: метка оси y с несколькими цветами
Причина, по которой я хочу, это потому, что я буду делать графики, которые будут содержать кривые (электрические поля и векторные потенциальные поля). Эти кривые будут разных цветов, и я хотел бы показать это в ярлыках. Ниже приведен упрощенный пример, используя предыдущий пост (Matplotlib multiple colours in tick labels), чтобы приблизиться. Это сообщение хорошо подходит для оси x, однако оно не занимает/не упорядочивает ось y правильно.
У другого поста был аналогичный вопрос (Partial coloring of text in matplotlib), но первый ответ больше не работал, и второй ответ заставляет сохранить файл как файл .ps.
Мой пример кода
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.offsetbox import AnchoredOffsetbox, TextArea, HPacker, VPacker
ax = plt.subplot(111)
x = np.linspace(0,10,10)
y1 = x
y2 = x**2
ax.plot(x,y1,color='r',label='data1')
ax.plot(x,y2,color='b',label='data2')
ax.set_xticks([]) # empty xticklabels
ax.set_yticks([]) # empty xticklabels
# x-axis label
xbox1 = TextArea("Data1-x ", textprops=dict(color="r", size=15))
xbox2 = TextArea("and ", textprops=dict(color="k", size=15))
xbox3 = TextArea("Data2-x ", textprops=dict(color="b", size=15))
xbox = HPacker(children=[xbox1, xbox2, xbox3],
align="center", pad=0, sep=5)
anchored_xbox = AnchoredOffsetbox(loc=3, child=xbox, pad=0., frameon=False,
bbox_to_anchor=(0.3, -0.07),
bbox_transform=ax.transAxes, borderpad=0.)
# y-axis label
ybox1 = TextArea("Data1-y ", textprops=dict(color="r", size=15,rotation='vertical'))
ybox2 = TextArea("and ", textprops=dict(color="k", size=15,rotation='vertical'))
ybox3 = TextArea("Data2-y ", textprops=dict(color="b", size=15,rotation='vertical'))
ybox = VPacker(children=[ybox1, ybox2, ybox3],
align="center", pad=0, sep=5)
anchored_ybox = AnchoredOffsetbox(loc=8, child=ybox, pad=0., frameon=False,
bbox_to_anchor=(-0.08, 0.4),
bbox_transform=ax.transAxes, borderpad=0.)
ax.add_artist(anchored_xbox)
ax.add_artist(anchored_ybox)
plt.legend()
plt.show()
Спасибо за помощь!
Вы думали об использовании 'TwinX()'? Я обычно рисую второй набор данных на второй оси y и меняю цвет соответственно – Moritz