#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-файл, прочитанный в функции анимации, и он использует все эти данные для анимации. Как бы то ни было, мне кажется, что вы отображаете график со всеми данными, отображаемыми неоднократно.