Две строки совместно используют невидимые xdata в matplotlib с разными xticks

#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")
  

Код выдает
введите описание изображения здесь
это хорошо, но имеет две проблемы:

  1. xlabels не выровнены с данными: синяя линия на графике начинается с метки x1 104500 , в то время как x1[0] = 29380 .
  2. Я не могу применить 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 не может использоваться при ручной настройке меток.