Python绘图教程——Matplotlib文档(详细版)后半部分
2017-07-28 11:11
761 查看
这部分包括:
简介
简单例子
matplotlib组件(Figure, Subplots, Axes and Ticks)
动画
其他的绘图模型
补充
中的456小节。
在matplotlib中制作动画的最简单的方法是声明一个FuncAnimation对象,它指定matplotlib要更新的数据是什么,更新功能是什么,帧之间的延迟是多少。
首先创建一个空白的figure:
然后,我们要创建几个圆,可以使用散点图对象。我们需要注意每个圆的初始大小(让它们从最大到最小)和颜色,也要确保最大的圆基本上变成透明的。
现在,我们需要为我们的动画编写更新功能。 我们知道,在每个时刻,每个圆圈应该会变得更加透明,而最大的戒指应该是完全透明的,从而被去除。 当然,我们实际上不会移除最大的戒指,但是重新使用它可以在新的随机位置设置一个新的圆圈,具有正常的尺寸和颜色。 因此,我们保持圆圈数不变。
最终代码和结果如下所示:
最后一步是告诉matplotlib将此功能用作动画的更新功能,并显示结果或将其另存为动图。
第一步是读取和转换数据。 我们将使用允许打开和读取远程数据的urllib库。 网站上的数据使用CSV格式,其内容由第一行给出:
time,latitude,longitude,depth,mag,magType,nst,gap,dmin,rms,net,id,updated,place,type
2015-08-17T13:49:17.320Z,37.8365,-122.2321667,4.82,4.01,mw,…
2015-08-15T07:47:06.640Z,-10.9045,163.8766,6.35,6.6,mwp,…
我们只对纬度,经度和幅度感兴趣,我们不会解析事件的时间
现在,我们需要画一个地图,精确地显示地震中心的位置,并在matplotlib可以处理的坐标中翻译纬度/经度。 幸运的是,安装和使用非常简单的底图项目(往往被更完整的cartopy替代)。 第一步是定义一个投影来将地球画在屏幕上(存在许多不同的投影),我们将坚持对于像我这样的非专家相当标准的投影机。
接下来,我们要求绘制海岸线和填充大陆:
地球物体也将被用来相当自动的翻译坐标。 我们差不多完了 最后一步是放一些圆点上去并调整大小颜色。
全部代码和结果如下所示:
简介
简单例子
matplotlib组件(Figure, Subplots, Axes and Ticks)
动画
其他的绘图模型
补充
中的456小节。
Animation
很长一段时间,matplotlib的动画并不是一件容易的事情,主要是通过聪明的黑客进行的。 然而,自1.1版本以来,事情已经开始改变,并且引入了非常直观地创建动画的工具,可以以各种格式保存它们(但是不要期望能够以60 fps运行非常复杂的动画)。在matplotlib中制作动画的最简单的方法是声明一个FuncAnimation对象,它指定matplotlib要更新的数据是什么,更新功能是什么,帧之间的延迟是多少。
水滴
在一个图片中,借助于小的逐渐增大的圆,随机分布在figure上,就获得了一个简单的下雨效果图。当然,在圆应当消失的时候,它们就不在增大了。我们可以用原来越淡的圆来模拟水波的消失,在消失后,去掉这个圆然后创建新的。首先创建一个空白的figure:
# 创建新的figure,背景颜色为白色 fig = plt.figure(figsize=(6,6), facecolor='white') # 创建新的axis覆盖整个figure,没有边框,纵横比为1:1 ax = fig.add_axes([0,0,1,1], frameon=False, aspect=1)
然后,我们要创建几个圆,可以使用散点图对象。我们需要注意每个圆的初始大小(让它们从最大到最小)和颜色,也要确保最大的圆基本上变成透明的。
# 圆圈的数目 n = 50 size_min = 50 size_max = 50*50 # 圆圈的位置 P = np.random.uniform(0,1,(n,2)) # 圆圈的颜色 C = np.ones((n,4)) * (0,0,0,1) # Alpha color channel goes from 0 (transparent) to 1 (opaque) C[:,3] = np.linspace(0,1,n) # 圆圈的大小 S = np.linspace(size_min, size_max, n) # 散点图 scat = ax.scatter(P[:,0], P[:,1], s=S, lw = 0.5, edgecolors = C, facecolors='None') # 坐标范围[0, 1],坐标轴下标为空 ax.set_xlim(0,1), ax.set_xticks([]) ax.set_ylim(0,1), ax.set_yticks([])
现在,我们需要为我们的动画编写更新功能。 我们知道,在每个时刻,每个圆圈应该会变得更加透明,而最大的戒指应该是完全透明的,从而被去除。 当然,我们实际上不会移除最大的戒指,但是重新使用它可以在新的随机位置设置一个新的圆圈,具有正常的尺寸和颜色。 因此,我们保持圆圈数不变。
def update(frame): global P, C, S # 所有的圆圈都在变淡 C[:,3] = np.maximum(0, C[:,3] - 1.0/n) # 所有的圆圈都在变大 S += (size_max - size_min) / n # 重置圆圈 i = frame % 50 P[i] = np.random.uniform(0,1,2) S[i] = size_min C[i,3] = 1 # 更新散点图 scat.set_edgecolors(C) scat.set_sizes(S) scat.set_offsets(P) # 返回对象 return scat
最终代码和结果如下所示:
最后一步是告诉matplotlib将此功能用作动画的更新功能,并显示结果或将其另存为动图。
animation = FuncAnimation(fig, update, interval=10, blit=True, frames=200) # animation.save('rain.gif', writer='imagemagick', fps=30, dpi=40) plt.show()
地震
我们现在将使用动画来观察过去30天内地球上的地震。 USGS地震危害计划是“国家地震危害减少计划”(NEHRP)的一部分,并在其网站上提供了几个数据。 这些数据根据地震幅度进行分类,范围从重大到仅次于所有地震,主要或次要。 你会惊讶于地球上每小时发生的小地震的数量。 由于这将为我们提供太多的数据,所以我们会专注于大于4.5的地震。 在撰写本报告时,已经在过去30天内发生了300多次地震。第一步是读取和转换数据。 我们将使用允许打开和读取远程数据的urllib库。 网站上的数据使用CSV格式,其内容由第一行给出:
time,latitude,longitude,depth,mag,magType,nst,gap,dmin,rms,net,id,updated,place,type
2015-08-17T13:49:17.320Z,37.8365,-122.2321667,4.82,4.01,mw,…
2015-08-15T07:47:06.640Z,-10.9045,163.8766,6.35,6.6,mwp,…
我们只对纬度,经度和幅度感兴趣,我们不会解析事件的时间
import urllib from mpl_toolkits.basemap import Basemap # -> http://earthquake.usgs.gov/earthquakes/feed/v1.0/csv.php feed = "http://earthquake.usgs.gov/earthquakes/feed/v1.0/summary/" # 表计最近30天的地震 # url = urllib.request.urlopen(feed + "significant_month.csv") # 震级 > 4.5 url = urllib.request.urlopen(feed + "4.5_month.csv") # 震级 > 2.5 # url = urllib.request.urlopen(feed + "2.5_month.csv") # 震级 > 1.0 # url = urllib.request.urlopen(feed + "1.0_month.csv") # 读取数据 data = url.read() data = data.split(b'\n')[+1:-1] E = np.zeros(len(data), dtype=[('position', float, 2), ('magnitude', float, 1)]) for i in range(len(data)): row = data[i].split(',') E['position'][i] = float(row[2]),float(row[1]) E['magnitude'][i] = float(row[4])
现在,我们需要画一个地图,精确地显示地震中心的位置,并在matplotlib可以处理的坐标中翻译纬度/经度。 幸运的是,安装和使用非常简单的底图项目(往往被更完整的cartopy替代)。 第一步是定义一个投影来将地球画在屏幕上(存在许多不同的投影),我们将坚持对于像我这样的非专家相当标准的投影机。
fig = plt.figure(figsize=(14,10)) ax = plt.subplot(1,1,1) earth = Basemap(projection='mill')
接下来,我们要求绘制海岸线和填充大陆:
earth.drawcoastlines(color='0.50', linewidth=0.25) earth.fillcontinents(color='0.95')
地球物体也将被用来相当自动的翻译坐标。 我们差不多完了 最后一步是放一些圆点上去并调整大小颜色。
P = np.zeros(50, dtype=[('position', float, 2), ('size', float, 1), ('growth', float, 1), ('color', float, 4)]) scat = ax.scatter(P['position'][:,0], P['position'][:,1], P['size'], lw=0.5, edgecolors = P['color'], facecolors='None', zorder=10) def update(frame): current = frame % len(E) i = frame % len(P) P['color'][:,3] = np.maximum(0, P['color'][:,3] - 1.0/len(P)) P['size'] += P['growth'] magnitude = E['magnitude'][current] P['position'][i] = earth(*E['position'][current]) P['size'][i] = 5 P['growth'][i]= np.exp(magnitude) * 0.1 if magnitude < 6: P['color'][i] = 0,0,1,1 else: P['color'][i] = 1,0,0,1 scat.set_edgecolors(P['color']) scat.set_facecolors(P['color']*(1,1,1,0.25)) scat.set_sizes(P['size']) scat.set_offsets(P['position']) return scat, animation = FuncAnimation(fig, update, interval=10) plt.show()
全部代码和结果如下所示:
其他绘图模型
Regular Plots
源代码和结果如下所示:Scatter Plots
源代码和结果如下所示:Bar Plots
源代码和结果如下所示:Contour Plots
源代码和结果如下所示:Imshow
源代码和结果如下所示:Pie Charts
源代码和结果如下所示:Quiver Plots
源代码和结果如下所示:Grids
源代码和结果如下所示:Multi Plots
源代码和结果如下所示:Polor Axis
源代码和结果如下所示:3D Plots
源代码和结果如下所示:Text
源代码和结果如下所示:Matplotlib官网文档
链接相关文章推荐
- Python绘图教程——Matplotlib文档(详细版)后半部分
- Python绘图教程——Matplotlib文档(详细版)后半部分
- Matplotlib教程(详细版)前半部分
- Matplotlib教程(详细版)前半部分
- Matplotlib教程(详细版)前半部分
- python数据可视化系列教程——matplotlib绘图全解
- Python 绘图库 Matplotlib 入门教程
- py科学绘图库matplotlib详细教程
- Python开发环境Wing IDE使用教程之matplotlib 2D绘图库代码调试技巧
- 【python数据挖掘课程】十.Pandas、Matplotlib、PCA绘图实用代码补充
- python使用matplotlib绘图 -- barChart
- python之matplotlib教程(转载)
- Python 绘图 MatPlotLib常用方法
- Python--matplotlib绘图可视化知识点整理
- python3使用matplotlib出现ImportError: No module named '_tkinter' 详细解决方法
- 【Python开发】matplotlib绘图不显示问题解决plt.show()
- 使用python中的Matplotlib绘图示例
- Python 中,matplotlib绘图无法显示中文的问题
- Python绘图问题:Matplotlib中%matplotlib inline是什么、如何使用?
- python matplotlib绘图时图例显示问题