#python #matplotlib
#python #matplotlib
Вопрос:
У меня есть два набора массивов x1, y1, t1
и x2, y2, t1
— x
данные, y
данные и измерение времени.
Я хотел бы отобразить два этих набора в виде строк с временем в качестве x
аргумента в plot()
, чтобы строки были выровнены относительно временного приоритета событий.
Однако я также хотел бы видеть соответствующие x1
и x2
на графике в виде xlabels (скажем, вверху и внизу графика), а также иметь две шкалы для y
значений (т. Е. слева и справа от рисунка).
import numpy as np
t1 = np.linspace(0, 10, 10)
y1 = np.arange(10)
x1 = (np.cumsum(np.random.rand(10)) * 1000000000).astype(int)
x1 = (x1 / 100000).astype(int) * 10
x2 = (np.cumsum(np.random.rand(10)) * 1000000000).astype(int)
x2 = (x2 / 1000000).astype(int)
y2 = 2 * np.arange(10)
t2 = np.linspace(0, 10, 10) 2
from matplotlib import pyplot as plt
fig, ax1 = plt.subplots()
ax1.plot(t1, y1)
ax1.set_ylabel("y1 label")
ax1.set_xticklabels(x1)
ax1.set_xlabel("x1 label")
ax2 = ax1.twinx()
ax2.plot(t2, y2, c='r')
ax2.set_ylabel("y2 label")
ax3 = ax2.twiny()
ax3.xaxis.set_ticks_position('top')
ax3.set_xticklabels(x2);
ax3.set_xlabel("x2 label")
Код выдает
это хорошо, но имеет две проблемы:
xlabels
не выровнены с данными: синяя линия на графике начинается с метки x1104500
, в то время какx1[0] = 29380
.- Я не могу применить
sci
формат для тиковx1
иx2
, то есть строки
ax1.ticklabel_format(style='sci', axis='x', scilimits=(0,0))
сбой с This method only works with the ScalarFormatter
, что разумно, поскольку я заменил метки тиков, а не сами тики. С другой стороны, я не могу назначить x1
для xticks
, поскольку это изменит пределы xaxis.
Как я мог бы преодолеть две эти проблемы?
Комментарии:
1.
set_xticklabels
используется для установки меток.set_xticks
используется для установки позиций. Если вы не зададите конкретные позиции, ваши метки не будут относиться ни к чему полезному.scilimits
не может использоваться при ручной настройке меток.