超簡(jiǎn)單,百行Python代碼制作動(dòng)態(tài)條形圖跳舞
打碼不易,不想被白嫖,有需要完整代碼和GDP數(shù)據(jù)集的同學(xué),可以對(duì)本文點(diǎn)贊,在看,和分享后在公眾號(hào)“算法美食屋”后臺(tái)回復(fù)關(guān)鍵字:動(dòng)態(tài)圖,添加作者微信獲取。感謝支持。??
先上圖片:

再上視頻:
最后上代碼:
import numpy as np
import pandas as pd
import matplotlib as mpl
from matplotlib import pyplot as plt
import matplotlib.animation as animation
import imageio
import os
import cv2
from PIL import Image
cmap = [
'#2E91E5',
'#1CA71C',
'#DA16FF',
'#B68100',
'#EB663B',
'#00A08B',
'#FC0080',
'#6C7C32',
'#862A16',
'#620042',
'#DA60CA',
'#0D2A63']*100
def bar_chart_dance(df,filename = None,title = "",figsize = (6,3.5),dpi = 144,duration = 2):
assert filename is None or filename.endswith(".html"), "filename should like *.html!"
fig,ax = plt.subplots(figsize=figsize,dpi=dpi)
ax.set_facecolor("0.9")
# 調(diào)整spines
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
ax.spines["left"].set_visible(False)
ax.spines["bottom"].set_visible(False)
def plot_frame(i):
# 添加文本
ax.clear()
ax.set_title(title)
ax.text(0.05,0.85,f"{df.iloc[i-1,0]}:{df.iloc[i-1,1]}",
transform = ax.transAxes, ha = "left")
if i <8:
xdata = df.iloc[0:i,0].tolist()
ydata = df.iloc[0:i,1].tolist()
colors = cmap[0:i]
ax.bar(xdata,ydata,color =colors,zorder = 4)
plt.xticks(range(8),xdata,horizontalalignment = "center",rotation = 0)
values = df.iloc[:8,1].values
ylim = (values.min(),values.max())
ax.set_ylim(ymin = ylim[0]-(ylim[1]-ylim[0])/10,ymax = ylim[1]+(ylim[1]-ylim[0])/10)
ax.set_xlim(xmin = -0.6,xmax = 6.6)
ax.tick_params(bottom = False,left = False,labelsize = 8,direction = "in",length = 2)
else:
xdata = df.iloc[i-7:i,0].tolist()
ydata = df.iloc[i-7:i,1].tolist()
colors = cmap[i-7:i]
ax.bar(xdata,ydata,color =colors)
plt.xticks(range(8),xdata,horizontalalignment = "center",rotation = 0)
values = df.iloc[i-7:i,1].values
ylim = (values.min(),values.max())
ax.set_ylim(ymin = ylim[0]-(ylim[1]-ylim[0])/10,ymax = ylim[1]+(ylim[1]-ylim[0])/10)
ax.set_xlim(xmin = -0.6,xmax = 6.6)
ax.tick_params(bottom = False,left = False,labelsize = 8,direction = "in",length = 2)
my_animation = animation.FuncAnimation(fig,plot_frame,frames = range(1,len(df)+1),interval = int(duration*1000))
if filename is None:
try:
from IPython.display import HTML
HTML(my_animation.to_jshtml())
return HTML(my_animation.to_jshtml())
except ImportError:
pass
else:
my_animation.save(filename)
return filename
df = pd.read_csv("./data/gdp_china_2019.csv")
df = df[["省份","人均GDP"]].sort_values("人均GDP")
df["省份"] = [x if "自治區(qū)" not in x else x[0:2] for x in df["省份"]]
df["人均GDP"] = [int(x) for x in df["人均GDP"]]
df.index = range(len(df))
html_file = "bar_chart_dance.html"
bar_chart_dance(df,filename = html_file,title = "中國(guó)大陸各省市2019人均GDP(人民幣)")
主要思路是構(gòu)建plot_frame函數(shù)逐幀繪制圖像,再用matplotlib的animation模塊制作動(dòng)畫。
收工。??
打碼不易,不想被白嫖,有需要完整代碼和GDP數(shù)據(jù)集的同學(xué),可以對(duì)本文點(diǎn)贊,在看,和分享后在公眾號(hào)“算法美食屋”后臺(tái)回復(fù)關(guān)鍵字:動(dòng)態(tài)圖,添加作者微信獲取。感謝支持。??
評(píng)論
圖片
表情
