Мы создаем два пустых списка для хранения дат и температурных максимумов из файла (1) . Затем программа преобразует данные, содержащие информацию даты (row[0]), в объект datetime (2), который присоединяется к dates. Значения дат и температурных максимумов передаются plot() в точке (3). Вызов fig.autofmt_xdate() в точке (4) выводит метки дат по диагонали, чтобы они не перекрывались. На рис. 16.2 изображена новая версия графика.
Расширение временного диапазона
Итак, график успешно создан. Добавим на него новые данные для получения более полной картины погоды в Ситке. Скопируйте файл sitka_weather_2014.csv, содержащий погодные данные для Ситки за целый год, в каталог с программами этой главы.
А теперь мы можем сгенерировать график с погодными данными за год:
highs_lows.py
...
# Чтение дат и температурных максимумов из файла.
(1) filename = 'sitka_weather_2014.csv'
with open(filename) as f:
...
# Форматирование диаграммы.
(2)plt.title("Daily high temperatures - 2014", fontsize=24)
plt.xlabel('', fontsize=16)
...
Значение filename изменено, чтобы в программе использовался новый файл данных sitka_weather_2014.csv (1) , а заголовок диаграммы приведен в соответствие с содержимым (2).
На рис. 16.3 изображена полученная диаграмма.
Рис. 16.3. Данные за год
Нанесение на диаграмму второй серии данных
Обновленный график на рис. 16.3 содержит значительное количество полезных данных, но график можно сделать еще полезнее, добавив на него данные температурных минимумов. Для этого необходимо прочитать температурные минимумы из файла данных и нанести их на график:
highs_lows.py
...
# Чтение дат, температурных максимумов и минимумов из файла.
filename = 'sitka_weather_2014.csv'
with open(filename) as f:
reader = csv.reader(f)
header_row = next(reader)
. .
(1) . .dates, highs, lows = [], [], []
for row in reader:
current_date = datetime.strptime(row[0], "%Y-%m-%d")
dates.append(current_date)
. . . .
high = int(row[1])
highs.append(high)
. . . .
(2) . . . .low = int(row[3])
. . . .lows.append(low)
# Нанесение данных на диаграмму.
fig = plt.figure(dpi=128, figsize=(10, 6))
plt.plot(dates, highs, c='red')
(3)plt.plot(dates, lows, c='blue')
# Формат диаграммы.
x plt.title("Daily high and low temperatures - 2014", fontsize=24)
...
Рис. 16.4. Две серии данных на одной диаграмме
В точке (1) создается пустой список lows для хранения температурных минимумов, после чего программа извлекает и сохраняет температурный минимум для каждой даты из четвертой позиции каждой строки данных (row[3]) (2). В точке (3) добавляется вызов plot() для температурных минимумов, которые окрашиваются в синий цвет. Затем остается лишь обновить заголовок диаграммы (4).
На рис. 16.4 изображена полученная диаграмма.
Цветовое выделение части диаграммы
После добавления двух серий данных можно переходить к анализу диапазона температур по дням. Пора сделать последний штрих в оформлении диаграммы: затушевать диапазон между минимальной и максимальной дневной температурой. Для этого мы воспользуемся методом fill_between(), который получает серию значений x и две серии значений y и заполняет область между двумя значениями y:
highs_lows.py
...
# Нанесение данных на диаграмму.
fig = plt.figure(dpi=128, figsize=(10, 6))
(1) plt.plot(dates, highs, c='red', alpha=0.5)
plt.plot(dates, lows, c='blue', alpha=0.5)
(2)plt.fill_between(dates, highs, lows, facecolor='blue', alpha=0.1)
...
Аргумент alpha (1) определяет степень прозрачности вывода. Значение 0 означает полную прозрачность, а 1 (по умолчанию) — полную непрозрачность. Со значением alpha=0.5 красные и синие линии на графике становятся более светлыми.
Рис. 16.5. Область между двумя наборами данных закрашена
В точке (2) fill_between() передается список dates для значений x и две серии значений y highs и lows. Аргумент facecolor определяет цвет закрашиваемой области; мы назначаем ему низкое значение alpha=0.1, чтобы заполненная область соединяла две серии данных, не отвлекая зрителя от передаваемой информации. На рис. 16.5 показана диаграмма с закрашенной областью между highs и lows.
Закрашенная область подчеркивает величину расхождения между двумя наборами данных.
Проверка ошибок
Программа highs_lows.py должна нормально работать для погодных данных любого места. Однако на некоторых метеорологических станциях происходят сбои, и станциям не удается собрать данные (полностью или частично). Отсутствие данных может привести к исключениям; если исключения не будут обработаны, то программа аварийно завершится.
Для примера попробуем построить график температур для Долины Смерти (штат Калифорния). Скопируйте файл death_valley_2014.csv в каталог с программами этой главы, после чего внесите изменения в highs_lows.py для работы с другим набором данных:
highs_lows.py
...
# Чтение дат, температурных максимумов и минимумов из файла.
filename = 'death_valley_2014.csv'
with open(filename) as f:
...