来自<Python成为专业人士笔记系列>
python成为专业人士笔记Matplotlib介绍
matplotlib是Python编程语言及其数值数学扩展包 NumPy的可视化操作界面。它利用通用的图形用户界面工具包,如Tkinter, wxPython, Qt或GTK+,向应用程序嵌入式绘图提供了应用程序接口(API)。此外,matplotlib还有一个基于图像处理库(如开放图形库OpenGL)的pylab接口,其设计与MATLAB非常类似–尽管并不怎么好用。SciPy就是用matplotlib进行图形绘制。
matplotlib最初由John D. Hunter撰写,它拥有一个活跃的开发社区,并且根据BSD样式许可证分发。 在John D. Hunter2012年去世前不久,Michael Droettboom被提名为matplotlib的主要开发者。
截至到2015年10月30日,matplotlib 1.5.x支持Python 2.7到3.5版本。Matplotlib 1.2是第一个支持Python 3.x的版本。Matplotlib 1.4是支持Python 2.6的最后一个版本。
与MATLAB的比较
pyplot是matplotlib的一个模块,它提供了一个类似MATLAB的接口。 matplotlib被设计得用起来像MATLAB,具有使用Python的能力。免费是其优点。
与 Gnuplot的比较
gnuplot和matplotlib都是成熟的开源项目。 它们都可以产生多种不同绘图类型。 虽然很难指定一种某人能做而他人不能做的图形类型,但它们仍然具有不同的优点和缺点:
优点缺点Matplotlib带有内置代码的默认绘图样式与Python的深度集成Matlab风格的编程接口(对一些人来说是优点,但对于其他人来说可能是缺点)。图形绘制相较Gnuplot更加美观高度依赖其他包,如Numpy。只适用于Python:很难/不可能在Python以外的语言中使用。 (但可以从Julia通过PyPlot软件包使用)Gnuplot跨语言解决方案:可以用作通过管道或文件以不同语言编写的应用程序(例如GNU Octave,Maxima,JavaGnuplotHybrid)中的绘图引擎。独立程序:没有外部依赖。处理大型数据集时非常快。更容易操纵绘图细节旧的默认绘图样式:通常需要小的调整以产生有吸引力的图。在开发中活跃成员的数量较少(与Matplotlib相比)。
例子[可使用创帆云免费JupyterNote环境测试]
曲线图
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> a = np.linspace(0,10,100)
>>> b = np.exp(-a)
>>> plt.plot(a,b)
>>> plt.show()
>>> import matplotlib.pyplot as plt
>>> from numpy.random import normal,rand
>>> x = normal(size=200)
>>> plt.hist(x,bins=30)
>>> plt.show()
散点图
>>> import matplotlib.pyplot as plt
>>> from numpy.random import rand
>>> a = rand(100)
>>> b = rand(100)
>>> plt.scatter(a,b)
>>> plt.show()
3D 图
>>> from matplotlib import cm
>>> from mpl_toolkits.mplot3d import Axes3D
>>> import matplotlib.pyplot as plt
>>> import numpy as np
>>> fig = plt.figure()
>>> ax = fig.gca(projection='3d')
>>> X = np.arange(-5, 5, 0.25)
>>> Y = np.arange(-5, 5, 0.25)
>>> X, Y = np.meshgrid(X, Y)
>>> R = np.sqrt(X**2 + Y**2)
>>> Z = np.sin(R)
>>> surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm)
>>> plt.show()
Matplotlib中的一个简单图形
这个示例演示了如何使用Matplotlib创建简单的正弦曲线 :
import numpy as np
import matplotlib.pyplot as plt
# 介于0 和 2*pi 之间的角
x = np.linspace(0, 2.0*np.pi, 101)
y = np.sin(x)
# 正弦函数
plt.plot(x, y)
plt.show()
使用免费创帆云在线JupyterNote运行后效果如下:
向简单图添加更多特性:轴标签、标题、轴刻度、网格和图例
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2.0*np.pi, 101)
y = np.sin(x)
# 在x轴和y轴上设置刻度值
xnumbers = np.linspace(0, 7, 15)
ynumbers = np.linspace(-1, 1, 11)
plt.plot(x, y, color='r', label='sin') # r - 红色
plt.xlabel("Angle in Radians")
plt.ylabel("Magnitude")
plt.title("Plot of some trigonometric functions")
plt.xticks(xnumbers)
plt.yticks(ynumbers)
plt.legend()
plt.grid()
plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend]
plt.show()
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2.0*np.pi, 101)
y = np.sin(x)
z = np.cos(x)
# X轴和Y轴设置刻度
xnumbers = np.linspace(0, 7, 15)
ynumbers = np.linspace(-1, 1, 11)
plt.plot(x, y, color='r', label='sin') # r - 红
plt.plot(x, z, color='g', label='cos') # g - 绿
plt.xlabel("Angle in Radians")
plt.ylabel("Magnitude")
plt.title("Plot of some trigonometric functions")
plt.xticks(xnumbers)
plt.yticks(ynumbers)
plt.legend()
plt.grid()
plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend]
plt.show()
使用免费创帆云在线JupyterNote运行后效果如下:
通过类似于MATLAB的图叠加,在同一图形中绘制多个图形
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2.0*np.pi, 101)
y = np.sin(x)
z = np.cos(x)
# X轴和Y轴设置刻度
xnumbers = np.linspace(0, 7, 15)
ynumbers = np.linspace(-1, 1, 11)
plt.plot(x, y, 'r', x, z, 'g') # r, g - 红和绿
plt.xlabel("Angle in Radians")
plt.ylabel("Magnitude")
plt.title("Plot of some trigonometric functions")
plt.xticks(xnumbers)
plt.yticks(ynumbers)
plt.legend(['sine', 'cosine'])
plt.grid()
plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend]
plt.show()
使用免费创帆云在线JupyterNote运行后效果如下:
多重绘图
与前面的示例类似,这里使用单独的plot命令将正弦曲线和余弦曲线绘制在同一图形上。这更符合python的风格,可以用于为每个plot获得单独的句柄
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2.0*np.pi, 101)
y = np.sin(x)
z = np.cos(x)
# X轴和Y轴设置刻度
xnumbers = np.linspace(0, 7, 15)
ynumbers = np.linspace(-1, 1, 11)
plt.plot(x, y, color='r', label='sin') # r - 红
plt.plot(x, z, color='g', label='cos') # g - 绿
plt.xlabel("Angle in Radians")
plt.ylabel("Magnitude")
plt.title("Plot of some trigonometric functions")
plt.xticks(xnumbers)
plt.yticks(ynumbers)
plt.legend()
plt.grid()
plt.axis([0, 6.5, -1.1, 1.1]) # [xstart, xend, ystart, yend]
plt.show()
使用免费创帆云在线JupyterNote运行后效果如下:
使用twiny()绘制相同x轴但不同y轴的图形
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 2.0*np.pi, 101)
y = np.sin(x)
z = np.sinh(x)
# 分离图形对象和轴对象
fig, ax1 = plt.subplots()
# 复制不同的y坐标轴及相同的x轴
ax2 = ax1.twinx() # ax2 和ax1 将有共同的x轴和不同的y轴
# 在坐标轴1和2上绘制曲线,并获得曲线句柄
curve1,= ax1.plot(x, y, label="sin", color='r')
curve2,= ax2.plot(x, z, label="sinh", color='b')
# 创建一个list列表来访问曲线中的参数
curves = [curve1, curve2]
# 通过坐标轴1或坐标轴2对象添加图例
ax1.legend(curves, [curve.get_label() for curve in curves])
#ax2.legend(curves, [curve.get_label() for curve in curves]) # ax1和ax2任意添加一个即可
# 图像全局属性
plt.title("Plot of sine and hyperbolic sine")
plt.show()
使用创帆云免费JupyterNote云环境运行如下:
使用twiny()绘制共y轴和不同x轴的图形
import numpy as np
import matplotlib.pyplot as plt
y = np.linspace(0, 2.0*np.pi, 101)
x1 = np.sin(y)
x2 = np.sinh(y)
# 在x和y轴上制造刻度值
ynumbers = np.linspace(0, 7, 15)
xnumbers1 = np.linspace(-1, 1, 11)
xnumbers2 = np.linspace(0, 300, 7)
# 分离图形对象和轴对象
fig, ax1 = plt.subplots()
# 用不同的x轴和相同的y轴复制坐标轴
ax2 = ax1.twiny() # ax2 和ax1 将有公共的Y轴和不同的X轴
# 在坐标轴1和2上绘制曲线,并获得曲线句柄
curve1,= ax1.plot(x1, y, label="sin", color='r')
curve2,= ax2.plot(x2, y, label="sinh", color='b')
# 创建一个list 访问参数
curves = [curve1, curve2]
# 给轴1或轴2添加图例(只需给其中一个增加即可)
# ax1.legend(curves, [curve.get_label() for curve in curves])
ax2.legend(curves, [curve.get_label() for curve in curves])
# x axis labels via the axes
ax1.set_xlabel("Magnitude", color=curve1.get_color())
ax2.set_xlabel("Magnitude", color=curve2.get_color())
# y axis label via the axes
ax1.set_ylabel("Angle/Value", color=curve1.get_color())
# ax2.set_ylabel("Magnitude", color=curve2.get_color()) # 注意,这个写法是错误的,ax2 没有属性控制y轴
# y刻度——也给它们上颜色
ax1.tick_params(axis='y', colors=curve1.get_color())
# ax2.tick_params(axis='y', colors=curve2.get_color()) # 注意,此写法是错误的ax2 没有属性控制y轴
#x轴通过坐标轴旋转
ax1.tick_params(axis='x', colors=curve1.get_color())
ax2.tick_params(axis='x', colors=curve2.get_color())
# 设置x轴刻度
ax1.set_xticks(xnumbers1)
ax2.set_xticks(xnumbers2)
# 设置y轴刻度
ax1.set_yticks(ynumbers)
# ax2.set_yticks(ynumbers) # 这样写也是可以的
# 用坐标轴制作网格
ax1.grid(color=curve2.get_color())
ax2.grid(color=curve2.get_color())
ax1.xaxis.grid(False)
# 图表全局属性设置
plt.title("Plot of sine and hyperbolic sine")
plt.show()
使用创帆云免费JupyterNote云环境运行如下: