Установка диапазона меток оси x при автоматическом масштабировании y в matplotlib - PullRequest
0 голосов
/ 14 мая 2018

Мне очень трудно добиться чего-то, что кажется очень простым, с помощью 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()

enter image description here

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

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()

enter image description here

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

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

По сути, я просто хочу первый график с осями второго.

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Может быть, я неправильно понимаю вопрос, но это должно быть так же просто, как создать серию 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)

enter image description here

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

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

0 голосов
/ 15 мая 2018

Наконец-то нашел решение, которое работает. Возможно, есть лучший способ.

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

Edit:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...