您的位置:首页 > 编程语言 > Python开发

Python绘图教程——Matplotlib文档(详细版)后半部分

2017-07-28 11:11 761 查看
这部分包括:

简介

简单例子

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官网文档

链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  matplotlib python