Как индексировать или наносить на график даты после повторной выборки, чтобы они правильно отображались на оси гистограммы? - PullRequest
0 голосов
/ 03 июля 2018

Я хочу отобразить данные по третьему графику по оси абсцисс в дату-время, как и мои два других графика (см. Связанный рисунок). Я использовал аналогичные подходы к каждому графику, но переделал третий набор данных, чтобы построить график осадков в виде столбчатой ​​диаграммы за каждый час моего периода времени. Когда я первоначально попытался отформатировать дату для третьего графика, как я это делал в предыдущих двух, метки оси X либо исчезли, либо данные не отображаются правильно. В приведенной ниже ссылке данные отображаются так, как я намеревался.

Три участка осадков

Мои данные временных рядов выглядят так, где меня интересуют только «Чтение» и «Значение»:

Reading,Receive,Value,Unit,Quality
2018-04-07 13:09:28,2018-04-07 13:09:35,0.00,in,A
2018-04-07 06:01:25,2018-04-07 06:01:35,0.04,in,A
2018-04-07 04:38:15,2018-04-07 04:38:35,0.04,in,A

Вот как я добился правильной схемы во втором сюжете:

import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import matplotlib.patches as patches
import matplotlib.dates as mdates
import datetime as dt

#read data from csv
data2 = pd.read_csv('Arroyo_Corte_Madera_del_Presidio_38021_Precipitation_Accumulation_0.txt', usecols=['Reading','Value'], parse_dates=['Reading'])

#set date as index
data2.set_index('Reading',inplace=True)

#plot data
ax2 = plt.subplot(3, 1, 2)
data2.plot(ax=ax2)

#set ticks every 12 hours
ax2.xaxis.set_major_locator(mdates.HourLocator(byhour=range(0,24,12)))
plt.xticks(rotation=0, ha='center')

#format date
ax2.xaxis.set_major_formatter(mdates.DateFormatter('%b %d\n%H:%M:%S'))

ax2.legend().set_visible(False)
ax2.set_title('Accumulated Rainfall\nApril 5-7, 2018')
ax2.set_xlabel('')
ax2.set_ylabel('Inches Since Oct 1 2017')
ax2.set_ylim(17.5, 22)

arrow_date2 = mdates.datestr2num('04/07/2018 04:30:00')
start_date2 = mdates.datestr2num('04/07/2018 03:00:00')
end_date2 = mdates.datestr2num('04/07/2018 06:00:00')
text_date2 = mdates.datestr2num('04/07/2018 03:00:00')
ax2.axvspan(start_date2, end_date2, 0.86, 0.97, color='green', alpha=0.35)

ax2.annotate("Approximate time of\nSlope Failure", xy=(arrow_date2, 21.5), xycoords='data', xytext=(text_date2, 19), textcoords='data', arrowprops=dict(arrowstyle="->", connectionstyle="arc3"))

Мой код для третьего подпункта:

#read data from csv
data =pd.read_csv('Arroyo_Corte_Madera_del_Presidio_38021_Precipitation_Increment_0.txt', usecols=['Reading','Value'], parse_dates=['Reading'])

#set date as index
data.set_index('Reading',inplace=True)
resamp = data.resample('1H').sum().reset_index()

#plot data
ax3 = plt.subplot(3, 1, 3)
resamp.plot(kind='bar',ax=ax3, x='Reading', y='Value', width=0.9)

#set ticks every other hour
plt.xticks(ha='center')
for label in ax3.xaxis.get_ticklabels()[::2]:
       label.set_visible(False)

ax3.legend().set_visible(False)
ax3.set_title('Rainfall in Hours\nApril 6-7, 2018')
ax3.set_xlabel('')
ax3.set_ylabel('Precipitation Increment (in)')

plt.show()

Как исправить мой код, чтобы метки осей отображались так, как я хочу, чтобы они наносились?

1 Ответ

0 голосов
/ 03 июля 2018

Мой код был неверным, очевидно. Когда я пересчитал данные, я сбросил индекс. Это создало новый столбец индекса, который связывался с моими желаемыми значениями x («Чтение»). Кроме того, я не должен был наносить 'x' в resamp.plot. Помогло это решение: Печать с помощью панд . Вот исправленный код:

#read data from csv
data = pd.read_csv('Arroyo_Corte_Madera_del_Presidio_38021_Precipitation_Increment_0.txt', usecols=['Reading','Value'], parse_dates=['Reading'])

#set date as index
data.set_index('Reading',inplace=True)
resamp = data.resample('1H').sum()   # changed here

#plot data
ax3 = plt.subplot(3, 1, 3)
resamp.plot(ax=ax3, y='Value', kind='bar', width=0.9) # changed here

ax3.set_xticklabels([dt.strftime('%b %d\n%H:%M:%S') for dt in resamp.index])
plt.xticks(rotation=0, ha='center')
for i, tick in enumerate(ax3.xaxis.get_major_ticks()):
     if (i % (4) != 0): # 4 hours 
         tick.set_visible(False)
ax3.legend().set_visible(False)
ax3.set_title('Rainfall in Hours\nApril 6-7, 2018')
ax3.set_xlabel('')
ax3.set_ylabel('Precipitation Increment (in)')
ax3.set_ylim(0.00, 0.40)

plt.show()
...