主要内容 #
综合实战:数据可视化,了解NumPy和Matplotlib的数据分析基础包,掌握数据可视化的基本编写7.GDP简单动态图 #
事实上在上节课的data.txt数据文件中,包含了1960-2017的58年数据。在以下示例中我们使用简单的for循环,实现了58年的简单经济变迁图(资源文件见上节课链接)import numpy as np import matplotlib.pyplot as plt plt.rc('font',family='SimHei') fig,ax=plt.subplots(dpi=100) gdplist=[] with open('P83_1data.txt') as data: for line in data: a=line.strip().split('\t') gdplist.append(a) gdp=np.array(gdplist) for i in range(1,59): plt.cla()#清除上一个子图像 x=gdp[:,0]#二维矩阵取第一列 y=gdp[:,i].astype(float)#二维矩阵取第i+1列 bars=ax.barh(x[1:],y[1:])#绘制柱状图并返回bars #设置标题,添加文字说明 ax.set_title('1960-2017年世界GDP排名图(单位:$)',fontsize=20) ax.spines['top'].set_color('none')#顶部的spine颜色设置为无 ax.spines['right'].set_color('none')#右边的spine颜色设置为无 ax.text(0.8 * ax.get_xlim()[1], 1, "{}年".format(1959+i), fontsize=20)#ax.get_xlim()返回的是tuple(xmin,xmax) for bar in bars: width = bar.get_width()#每个bar得到宽度,这里的宽度指的是横向的高度 plt.text(width +ax.get_xlim()[1] * 0.03, bar.get_y()+0.125, "{:.2f}百亿".format(width))#标记每个国家的GDP值 plt.pause(0.1)#每次绘制图形之间相隔0.1s plt.show()
8.GDP动态图(仅做了解) #
事实上Matplotlib包中的animation模块,可以帮助我们更方便的实现动态图形的绘制,以下示例仅做了解即可。具体可参考animation.FuncAnimation()参考手册(点击查询)
import numpy as np import matplotlib.pyplot as plt import matplotlib.animation as ani plt.rc('font',family='SimHei') fig,ax=plt.subplots(dpi=100) gdplist=[] with open('P83_1data.txt') as data: for line in data: a=line.strip().split('\t') gdplist.append(a) gdp=np.array(gdplist) def update(frame): plt.cla()#清除上一个子图像 x1=gdp[:,0]#二维矩阵取第一列 y1=gdp[:,frame].astype(float)#二维矩阵取第i+1列 z=dict(zip(x1[1:],y1[1:])) z=dict(sorted(z.items(),key = lambda x:x[1]))#字典按照values()排序 bars=ax.barh(list(z.keys()),list(z.values()),color=['r','g','b','y','c','m','g','brown','cyan','gold','tomato'])#绘制柱状图并返回bars #设置标题,添加文字说明 ax.set_title('1960-2017年世界GDP排名图(单位:$)',fontsize=20) ax.spines['top'].set_color('none')#顶部的spine颜色设置为无 ax.spines['right'].set_color('none')#右边的spine颜色设置为无 ax.text(0.8 * ax.get_xlim()[1], 1, "{}年".format(1959+frame), fontsize=20)#ax.get_xlim()返回的是tuple(xmin,xmax) for bar in bars: width = bar.get_width()#每个bar得到宽度,这里的宽度指的是横向的高度 plt.text(width +ax.get_xlim()[1] * 0.03, bar.get_y()+0.125, "{:.2f}百亿".format(width))#标记每个国家的GDP值 animator = ani.FuncAnimation(fig, update, frames=np.arange(1, 58), interval=50) #fig->需要更新的图像 update->需要更新的函数 frames->每次调用更新函数时传入的参数值 interval->每帧间隔单位毫秒 plt.show()