Я пытаюсь написать программу python, которая отображает анимацию карты мира, в которой страны меняют цвет, исходя из того, насколько они используются в возобновляемых источниках энергии. Я пытаюсь, чтобы он отображал цвета для всех стран в 1960 году, затем цвета для всех стран в 1961 году, а затем в 1962 году ...Анимация с использованием Cartopy
Я использую картографию, чтобы добавить страны к фигуре и основываться их цвет от значений, которые я втягиваю в базу данных pandas из базы данных SQL. Я смог получить карту, чтобы показать, что я хочу в течение года:
Однако я не могу понять, как его оживить. Я пытался использовать FuncAnimate, но я действительно пытаюсь понять, как это работает. На всех примерах, как представляется, есть функции, возвращающие строки, но я не являюсь графическими строками или контурами. Вот что я пробовал:
import sqlite3
import pandas as pd
import os
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib.animation as animation
import cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
from math import log
from math import exp
from matplotlib import colors
path = 'H:/USER/DVanLunen/indicator_data/world-development-indicators/'
os.chdir(path)
con = sqlite3.connect('database.sqlite')
# Grab :
# % of electricity from renewable sources EG.ELC.RNWX.ZS
# 1960 - 2013
Indicator_df = pd.read_sql('SELECT * '
'FROM Indicators '
'WHERE IndicatorCode in('
'"EG.ELC.RNWX.ZS"'
')'
, con)
# setup colorbar stuff and shape files
norm = mpl.colors.Normalize(vmin=0, vmax=30)
colors_in_map = []
for i in range(30):
val = log(i + 1, logbase)/log(31, logbase)
colors_in_map.append((1 - val, val, 0))
cmap = colors.ListedColormap(colors_in_map)
shpfilename = shpreader.natural_earth(resolution='110m',
category='cultural',
name='admin_0_countries')
reader = shpreader.Reader(shpfilename)
countries_map = reader.records()
logbase = exp(1)
fig, ax = plt.subplots(figsize=(12, 6),
subplot_kw={'projection': ccrs.PlateCarree()})
def run(data):
"""Update the Dist"""
year = 1960 + data % 54
logbase = exp(1)
for n, country in enumerate(countries_map):
facecolor = 'gray'
edgecolor = 'black'
indval = Indicator_df.loc[(Indicator_df['CountryName'] ==
country.attributes['name_long']) &
(Indicator_df['Year'] == year), 'Value']
if indval.any():
greenamount = (log(float(indval) + 1, logbase)/
log(31, logbase))
facecolor = 1 - greenamount, greenamount, 0
ax.add_geometries(country.geometry, ccrs.PlateCarree(),
facecolor=facecolor, edgecolor=edgecolor)
ax.set_title('Percent of Electricity from Renewable Sources ' +
str(year))
ax.figure.canvas.draw()
cax = fig.add_axes([0.92, 0.2, 0.02, 0.6])
cb = mpl.colorbar.ColorbarBase(cax, cmap=cmap, norm=norm,
spacing='proportional')
cb.set_label('%')
ani = animation.FuncAnimation(fig, run, interval=200, blit=False)
plt.show()
Любая помощь была бы принята с благодарностью. Благодаря!
Некоторые примеры данных для Indicator_df (не реальный):
CountryName Year Value
United States 1960 5
United States 1961 10
United States 1962 20
United States 1963 30
Я в замешательстве ... что вы пытаетесь оживить? Вы хотите добавить страны по одному, или ... что? Кроме того, лучше указать пример с некоторыми точками данных вместо вашего SQL, чтобы другие могли его запускать. – Ajean
Спасибо за ваш ответ! Я пытаюсь, чтобы он отображал цвета для всех стран в 1960 году, затем цвета для всех стран в 1961 году, затем в 1962 году ... Я добавил некоторые примеры данных для Соединенных Штатов 1960-1963 годов. – DVL