Python画图很方便,不管是平时的学习还是教学当中,都将经常用到,特别直观,其中主要用到两个常用的库,一个二维和三维的:matplotlib.pyplot,mpl_toolkits.mplot3d
目录
点线图
直方图(Histogram)
子图(多个图形画在同一个图形里)
三维图形,以x²+y²函数图形为例
import numpy as np
import matplotlib.pyplot as plt
x = np.array([[0, 3, 5], [0, 1, 2],[3,4,7]])
y = np.array([[0, 6, 0], [1, 7, 0],[2,5,4]])
plt.plot(x, y,color='red',marker='.',markersize=20,linestyle='-')
plt.grid(True)
plt.show()
-----------------------------
array([[0, 3, 5],
[0, 1, 2],
[3, 4, 7]])
array([[0, 6, 0],
[1, 7, 0],
[2, 5, 4]])
-------------------------------
x,y生成的点的连线,从上面的图形可以看出,点和连线构成的新矩阵的点是:
[0,0],[0,1],[3,2]
[3,6],[1,7],[4,5]
[5,0],[2,0],[7,4]
如果我们使用meshgrid来生成新的矩阵将会是什么样的呢?
import numpy as np
import matplotlib.pyplot as plt
x = np.array([[0, 3, 5], [0, 1, 2],[3,4,7]])#np.array([0, 3, 5, 0, 1, 2,3,4,7])效果一样shape(9,)
y = np.array([[0, 6, 0], [1, 7, 0],[2,5,4]])#np.array([0, 6, 0, 1, 7, 0,2,5,4])效果一样shape(9,)
X,Y=np.meshgrid(x,y)
plt.plot(X,Y,color='red',marker='.',markersize=20,linestyle='-')
plt.grid(True)
plt.show()
X.shape和Y.shape都是(9, 9),简单来讲就是做了笛卡尔积的处理
import numpy as np
import matplotlib.pylab as plt
from matplotlib.font_manager import FontProperties
font=FontProperties(fname=r"C:\Windows\Fonts\simhei.ttf", size=14)
x=[11,12,12,12,13,30,31,30,40,40,44,40,40,40,40]
y=np.arange(10,51)
plt.hist(x,y)
plt.xlabel('年龄',FontProperties=font)
plt.ylabel('年龄的数量',FontProperties=font)
plt.title('10-50岁的年龄分布',FontProperties=font)
plt.show()
x=np.linspace(0,5)
y1=np.sin(x)
y2=np.sin(2*x)
plt.plot(x,y1,'b--',label='sinx')
plt.plot(x,y2,'r',label='sin2x')
plt.legend()
plt.show()
这样的两个函数图形挤在一个平面,不是很好观察,很多时候我们需要分布在不同位置,使用子图subplot来实现,如下:
x=np.linspace(0,5)
y1=np.sin(x)
y2=np.sin(2*x)
splt=plt.subplot(3,1,1)
plt.plot(x,y1,'b--',label='sinx')
plt.subplot(3,1,3)
plt.plot(x,y2,'r',label='sin2x')
plt.legend()
plt.show()
plt.subplot(3,1,1)表示的是3行1列,第一个子图的绘制
plt.subplot(3,1,3)表示的是3行1列,第三个子图的绘制
也可以使用下面这种方法:
figure,splt=plt.subplots(2,2)
splt[0][0].plot(x,y1)
splt[1][1].plot(x,y2)
plt.show()
这样更直观,在第几行几列进行图形的绘制
import matplotlib.pyplot as plt
import numpy as np
import mpl_toolkits.mplot3d as p3d
fig=plt.figure()
ax=p3d.Axes3D(fig)
x=np.arange(-3, 5, 0.1)
y=np.arange(-3, 5, 0.1)
X,Y=np.meshgrid(x, y)
Z=X**2+Y**2
ax.plot_surface(X,Y,Z, rstride=1, cstride=1, cmap='rainbow')
plt.savefig('D:/tony.png')
plt.show()
还有一种图形的画法,类似图片中有一张缩略图,我叫它图中图
import numpy as np
import matplotlib.pyplot as plt
fig=plt.figure()
x=np.linspace(1,10)
y=x
ax1=fig.add_axes([0.1,0.1,0.9,0.9])#(矩形:左、下、宽、高)
ax1.plot(x,y,'r')
ax1.set_title('y=x')
#绘制第二张图形,嵌套在里面
y1=np.cos(x)
ax2=fig.add_axes([0.2,0.6,0.3,0.3])
ax2.plot(x,y1,'g')
ax2.set_title('y=cosx')
plt.show()
图形里面默认不支持中文,可以通过指定字体来实现
import matplotlib.pyplot as plt
x=np.linspace(-10,10)
y=2**(x)
plt.plot(x,y)
plt.rcParams['font.family']=['STFangsong']
plt.title('Exponential Function(指数函数)')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.show()
import matplotlib
#显示有哪些字体
sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])
Python画图实战之画K线图https://blog.csdn.net/weixin_41896770/article/details/120634612