Установка диапазона меток оси 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() может использоваться, чтобы избежать ошибки округления.