Как очистить ось x для отображения временных меток с помощью matplotlib для отображения данных из csv-файла?

#python #matplotlib

Вопрос:

Я довольно новичок в этом деле, поэтому заранее приношу извинения за то, что задал очень простой вопрос. То, что я делаю, — это построение графика с использованием matplotlib из файла csv, в котором есть временные метки и значения напряжения от датчика. Проблема, с которой я сталкиваюсь, заключается в том, что ось x на построенном графике нечитаема, как видно на рисунке с графиком. Я был бы признателен, если бы кто-нибудь мог указать мне в правильном направлении, как сделать ось более читаемой при использовании текущего формата, который у меня есть. Пожалуйста, найдите прилагаемый код для создания этого сюжета. В других примерах, которые я обнаружил, чаще всего можно увидеть, как люди строят временные метки с помощью модуля datetime на графике. В моем случае я установил формат для меток времени в сценарии, который я написал, чтобы сгенерировать csv-файл с данными датчика и временем.

Спасибо, что уделили мне время.

 from itertools import count 
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

plt.style.use('fivethirtyeight')

x_vals = []
y_vals = []

#index = count()

def animate(i):
    data = pd.read_csv('/home/pi/musselmonitor/hall_readings.csv')
    #print(data.values)
    x_vals = [item[1]for item in data.values] 
    y_vals = [item[2]for item in data.values]

    
    plt.cla()
    plt.plot(x_vals, y_vals, label = 'Voltage over time')
    plt.xticks(rotation = 25)
    plt.autoscale(enable=True, axis='both', tight = None)
    plt.xlabel('Time')
    plt.ylabel('Voltage in mV')
    plt.legend(loc = 'upper left')
    plt.tight_layout()



ani = FuncAnimation(plt.gcf(),animate, interval = 1000)

plt.grid()
plt.tight_layout()
plt.show()
 

Ответ №1:

Основная идея анимации графика состоит в том, чтобы анимировать данные, которые будут использоваться, в соответствии с количеством кадров, поэтому сначала установите базовую форму графика в качестве начального значения. Затем обновите данные в функции анимации. Я не устанавливал специальный формат отображения для оси x, так как не уверен, указаны ли ваши тетра в формате даты/времени или в строке. В зависимости от ваших данных вам может потребоваться использовать locatoramp; fomatter. Смотрите здесь для получения дополнительной информации.

 import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import numpy as np

plt.style.use('fivethirtyeight')

date_rng = pd.date_range('2021-07-14', freq='1s', periods=300)
voltage = [np.random.uniform(0,1) 14 for n in range(300)]
df = pd.DataFrame({'timestamp':pd.to_datetime(date_rng, format='%H:%M%:%S'), 'voltage':voltage})

fig,ax = plt.subplots()

ax.set(xlim=(df['timestamp'].min(),df['timestamp'].max()), ylim=(14.0, 15.0))
line, = ax.plot([], [], 'b-', lw=3, label='Voltage over time')

ax.set_xlabel('Time')
ax.set_ylabel('Voltage in mV')
ax.grid()

def animate(i):
    line.set_data(df.loc[:i,'timestamp'], df.loc[:i,'voltage'])
    plt.setp(ax.get_xticklabels(), rotation=25, ha='right')

ani = FuncAnimation(fig, animate, frames=300, interval=100, repeat=False)

ax.legend(loc='upper left')
plt.tight_layout()
plt.show()
 

введите описание изображения здесь

Комментарии:

1. Если у вас все еще есть проблемы с форматом отображения оси x, пожалуйста, прокомментируйте. Если мой ответ был вам полезен, пожалуйста, поставьте галочку и примите его как правильный ответ.

2. Спасибо за ваш ответ. Это определенно дало мне некоторое лучшее представление о том, как подойти к проблеме, с которой я имею дело. Однако, как я уже упоминал в своем посте, моя проблема заключалась в том, что данные из csv-файла отображались неправильно. В частности, данные о времени в формате %H:%M%:%S не отображались. К сожалению, я не смог использовать метку времени, как она используется в вашем коде, поскольку метки времени, которые я получаю, напрямую связаны с генерируемым напряжением и хранятся в файле csv. Несмотря ни на что, я все равно ценю вашу помощь. Спасибо.

3. Я ответил, создав игрушечные данные, так как содержимое csv-файла мне не было представлено. Поэтому, если ваши данные представлены в общедоступном виде, проблема может быть решена. Кроме того, я думаю, что в вашем коде есть csv-файл, прочитанный в функции анимации, и он использует все эти данные для анимации. Как бы то ни было, мне кажется, что вы отображаете график со всеми данными, отображаемыми неоднократно.