Установка диапазона меток оси x при автоматическом масштабировании y в matplotlib

Я нахожу действительно трудным достичь чего-то, что кажется очень простым, используя matplotlib. У меня есть временной ряд из 1000 точек данных, записанных с интервалом в 10 секунд. Я хочу построить их так, чтобы диапазон оси X был правильно помечен от 0 до 10000. Я хочу, чтобы значения по оси Y выбирались автоматически.

Что бы я ни пытался, я не могу заставить matplotlib отображать какие-либо метки на оси x, кроме количества точек данных в массиве (т. Е. 0-1000). Я пытался:

заговор в два раза. Сначала дайте ему автомасштабироваться, затем вызовите plt.axis() для получения пределов x и y, а затем сохраните их для второго вызова plt.axis([a,b,c,d]). Это просто заговор 0-1000. Каким-то образом это просто проигнорировало меня и вернулось к 0-1000.

Я попробовал это:

ax = plt.subplot(111)  

ax.xaxis.set_data_interval(0, 10000)

также

plt.xlim(0, 10000)

безрезультатно, как и многие другие вещи, которые я сейчас удалил и забыл. Я не могу поверить, что я потратил несколько часов на это сейчас!

Кто-нибудь может помочь? Спасибо!

Изменить: меня попросили минимальный пример - вот два, которые иллюстрируют два результата, которые я нашел,

import matplotlib.pyplot as plt
tseries=[1,2,3,4,5,6,7,8,9,10]
plt.plot(tseries)
ax = plt.subplot(111)  
ax.xaxis.set_data_interval(0, 10000)
plt.show()

Этот просто игнорируется

import matplotlib.pyplot as plt
tseries=[1,2,3,4,5,6,7,8,9,10]
plt.plot(tseries)
plt.xlim(0, 100)
plt.show()

И этот сдавливает все данные, сохраняя их в диапазоне 0-10 графика.

Все методы, которые я попробовал, дали один из двух результатов выше

В основном я просто хочу первый сюжет с осями второго.

2 ответа

Решение

Может быть, я неправильно понимаю вопрос, но это должно быть так же просто, как создать серию X, которая содержит значения времени / метки, которые вы хотите. Нет необходимости делать какие-либо ограничения диапазона оси:

import matplotlib.pyplot as plt
import numpy as np
import random

values = random.sample(range(0,1000), 1000)
times = np.arange(len(values)) * 10

# alternatively:
# times = np.arange(0, len(values)*10, 10)

plt.plot(times, values)

values имеет ваши 1000 точек данных. вам нужно создать еще один массив, который содержит времена, связанные с каждым из ваших значений. В исходном вопросе вы не указали массив X, поэтому он просто отображал ваши значения по индексу (0-9)

Поскольку вы знаете, что каждая запись значения происходила с интервалом в 10 секунд, это должно быть так же просто, как создать список из 1000 элементов со значениями 0-1000, а затем умножить каждый элемент на 10, чтобы получить фактическое "записанное" время.

Наконец-то нашел решение, которое работает. Там, наверное, лучший способ.

x = np.arange(0.0, total_time, total_time/len(tseries))
y = np.array(tseries)
plt.plot(x.flatten(),y.flatten())

Редактировать:

Это иногда оказывалось неудачным, говоря, что длины x и y не были одинаковыми.
Я добавил этот хак, чтобы предотвратить это:

if len(x)!=len(y):
    l=min(len(x),len(y))
    x=x[:l]
    y=y[:l]

Я предполагаю, что это вызвано ошибками округления в термине "total_time/len(tseries") при создании x.
Edit2: г-н T указал ниже, что np.linspace() может использоваться, чтобы избежать ошибки округления.

Другие вопросы по тегам