python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))

Python数据可视化大杀器之地阶技法:matplotlib

  • 个人主页:JoJo的数据分析历险记
  • 个人介绍:小编大四统计在读,目前保研到统计学top3高校继续攻读统计研究生
  • 如果文章对你有帮助,欢迎?关注点赞、?收藏订阅专栏

文章目录
  • Python数据可视化大杀器之地阶技法:matplotlib
  • 1.简单图形绘制
  • 2.图片保存
  • ?3.设置图形颜色和样式
  • 4.坐标轴尺度转换
  • 5.子图绘制
  • 6.增加文本注释和图例
    • 6.1 增加文本
    • 6.2 增加图例
  • 7.复杂图形绘制
    • 7.1 极坐标图
    • 7.2 三维图
    • 7.3 绘制气泡图

一张好的图胜过一千个字,可视化也是机器学习的重要部分,它能够传达很多信息,之前我们介绍了如何使用 seaborn绘制图形,观看量还不错:感兴趣的小伙伴可以看一下,
Python数据可视化大杀器之天阶技法:Seaborn(学完可实现90%数据分析绘图)
于是本章介绍python中另一个可视化利器: matplotlib
matplotlib可以使用各种后端图形库(如TkwxPython等)输出图形。使用命令行运行python时,图形通常显示在单独的窗口中。在Jupyter笔记本中,我们可以通过运行%matplotlib inline 魔法命令简单地在笔记本中输出图形。下面看具体代码:
# 首先导入相关库 import matplotlib.pyplot as plt %matplotlib inline

1.简单图形绘制 我们通过一个简单图形的绘制来解释matplotlib是如何工作的,具体如下
plt.plot([1, 2, 4, 9, 5, 3]) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
可以看出,我们简单的使用了plot函数绘制了一个折线图,如果给plot函数一个数组,它将使用该数组作为纵轴上的坐标,并且只使用数组中每个数据点的索引作为水平坐标。还可以提供两个数组:一个用于水平轴x,另一个用于垂直轴y
plt.plot([-3, -2, 5, 0], [1, 6, 4, 3]) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
轴会自动匹配数据的范围。我们想给这个图多一点空间,所以让我们调用axis函数来改变每个轴的范围[xmin,xmax,ymin,ymax]。
plt.plot([-3, -2, 5, 0], [1, 6, 4, 3]) plt.axis([-4, 6, 0, 7]) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
现在,让我们画一个数学函数。我们使用NumPylinspace函数创建一个包含500个从-2到2的浮点的数组x,然后创建第二个数组y,计算为x的平方(要了解NumPy,请看我的这篇文章Python数据分析大杀器之Numpy详解)。
import numpy as np x = np.linspace(-2, 2, 500)#等间隔创建-2到2的500个数据 y = x**2 plt.plot(x, y) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
上面这个图形有点简易,我们来添加一个标题,以及x和y标签,并绘制网格
plt.plot(x, y) plt.title("Square function")#绘制标题 plt.xlabel("x")#x标签 plt.ylabel("y = x**2")#y标签 plt.grid(True)#显示网格 plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
2.图片保存 将图形保存到电脑非常简单,使用savefig即可。具体代码如下所示
x = np.linspace(-1.4, 1.4, 30) plt.plot(x, x**2) plt.savefig("二次函数图.png")

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
这个时候在当前文件夹下会出现二次函数图.png文件
?3.设置图形颜色和样式 默认情况下,matplotlib在连续点之间绘制一条直线。在某些情况下,为了方便对比信息,或者为了让图形更美观,我们需要对图形的颜色和形状进行设置
可以传递第三个参数来更改线条的样式和颜色。例如,“r–”表示“红色虚线”,具体代码如下所示。
x = np.linspace(-1, 1, 30) plt.plot(x, x, 'r--') plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
当我们需要在一张图上绘制多条曲线时候,只需要指定x1y1[style1]x2y2[style2],具体如下所示
x = np.linspace(-1, 1, 30) plt.plot(x, x, 'r--', x, x**2, 'g:', x, x**3, 'b^') plt.show()

?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Byb6ENYk-1651573628204)(output_21_0.png)]
?
此外,我们还可以设置透明度和线型宽度
x = np.linspace(-1, 1, 30) p1,p2,p3 = plt.plot(x, x, 'r--', x, x**2, 'g:', x, x**3, 'b^') p1.set_linewidth(3) p3.set_alpha(0.3) plt.show()

?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tdv8RxZW-1651573628205)(output_23_0.png)]
?
4.坐标轴尺度转换 Matplotlib支持非线性尺度转换,例如对数。
x = np.linspace(0.1, 15, 500) y = x**3/np.exp(2*x) plt.figure(1) plt.plot(x, y) plt.yscale('linear') plt.title('linear') plt.grid(True) plt.figure(2) plt.plot(x, y) plt.yscale('log')#将y轴尺度变换为log plt.title('log') plt.grid(True) plt.figure(3) plt.plot(x, y) plt.yscale('logit')#将y轴尺度变换为logit plt.title('logit') plt.grid(True) plt.figure(4) plt.plot(x, y - y.mean()) plt.yscale('symlog', linthreshy=0.05)#将y轴尺度变换为symlog plt.title('symlog') plt.grid(True) plt.show()

python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

5.子图绘制 matplotlib图形可能包含多个子图。这些子图被组织在一个网格中。要创建子图,只需调用subplot函数,并指定图中的行数和列数,以及要绘制的子图的索引(从1开始,然后从左到右,从上到下)。
x = np.linspace(-1, 1, 30) plt.subplot(2, 2, 1) #一共有两行两列, plt.plot(x, x) plt.subplot(2, 2, 2) plt.plot(x, x**2) plt.subplot(2, 2, 3) plt.plot(x, x**3) plt.subplot(2, 2, 4) plt.plot(x, x**4) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
注意: 我们可以使用subplot(221)表示subplot(2,2,1)
如果我们想要将某个图形占据多个网格,我们可以使用下面的代码:
plt.subplot(2, 2, 1) plt.plot(x, x) plt.subplot(2, 2, 2) plt.plot(x, x**2) plt.subplot(2, 1, 2) plt.plot(x, x**3) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
如果需要设置更复杂的子图,可以使用subplot2grid,然后通过索引指定绘制的位置,从0开始索引,通过rowspancolspan来指定图形站的位置大小我们一起来看下面这个案例
plt.subplot2grid((3,3), (0, 0), rowspan=2, colspan=2) plt.plot(x, x**2) plt.subplot2grid((3,3), (0, 2)) plt.plot(x, x**3) plt.subplot2grid((3,3), (1, 2), rowspan=2) plt.plot(x, x**4) plt.subplot2grid((3,3), (2, 0), colspan=2) plt.plot(x, x**5) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
但是每次我们都需要调用subplot()很繁琐,matplotlib允许使用subplots设置
x = np.linspace(-2, 2, 200) fig,ax[0:2] = plt.subplots(2, 1, sharex=True) fig.set_size_inches(10,5) p1,p2 = ax[0].plot(x, np.sin(3*x**2), "r-", x, np.cos(5*x**2), "b-") p3 = ax[1].plot(x, np.sin(3*x), "r-") ax[0].grid(True)

【python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))】?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
6.增加文本注释和图例 6.1 增加文本 增加文本主要有以下两种方法
  • text
  • annotate
可以调用text在图中的任何位置添加文本。只需指定水平和垂直坐标以及文本,还可以选择指定一些额外的属性。看下面这个代码
x = np.linspace(-1.5, 1.5, 30) px = 0.8 py = px**2plt.plot(x, x**2, "b-", px, py, "ro")plt.text(0, 1.5, "Square function\n$y = x^2$", fontsize=20, color='blue', horizontalalignment="center") plt.text(px - 0.08, py, "Beautiful point", ha="right", weight="heavy") plt.text(px, py, "x = %0.2f\ny = %0.2f"%(px, py), rotation=50, color='gray')plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
对图形的元素进行注释是很常见的,比如上面的漂亮点。我们可以使用annotate功能使这变得很容易:只需指示兴趣点的位置和文本的位置,以及文本和箭头的可选附加属性。
plt.plot(x, x**2, px, py, "ro") plt.annotate("Beautiful point", xy=(px, py), xytext=(px-1.3,py+0.5), color="green", weight="heavy", fontsize=14, arrowprops={"facecolor": "lightgreen"}) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
plt.plot(x, x**2, px, py, "ro") bbox_props = dict(boxstyle="rarrow,pad=0.3", ec="b", lw=2, fc="lightblue") plt.text(px-0.2, py, "Beautiful point", bbox=bbox_props, ha="right") bbox_props = dict(boxstyle="round4,pad=1,rounding_size=0.2", ec="black", fc="#EEEEFF", lw=5) plt.text(0, 1.5, "Square function\n$y = x^2$", fontsize=20, color='black', ha="center", bbox=bbox_props) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
6.2 增加图例 添加图例的最简单方法是在所有行上设置一个标签,然后调用legend函数。
x = np.linspace(-1.4, 1.4, 50) plt.plot(x, x**2, "r--", label="Square function") plt.plot(x, x**3, "g-", label="Cube function") plt.legend(loc="best")#设置图例位置 plt.grid(True) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
设置图例位置参数如下所示:
best
upper right
upper left
lower left
lower right
right
center left
center right
lower center
upper center
center
7.复杂图形绘制 上面我们介绍了如何建立一个基础图形,以及如何设置坐标轴、标题、坐标轴尺度转换、子图增加图例和注释等
接下来我们介绍一些更复杂的图形的绘制方法
7.1 极坐标图 绘制极坐标图只需要在设置子图时,将projection属性设置为polar
radius = 1 theta = np.linspace(0, 2*np.pi*radius, 1000)plt.subplot(111, projection='polar') plt.plot(theta, np.sin(5*theta), "g-") plt.plot(theta, 0.5*np.cos(20*theta), "b-") plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
7.2 三维图 绘制3D图形需要导入Axes3D,然后创建一个子图,将projection设置为3d。这将返回一个Axes3DSubplot对象,可以使用它调用plot_surface,提供x、y和z坐标,以及可选属性。
from mpl_toolkits.mplot3d import Axes3D x = np.linspace(-5, 5, 50) y = np.linspace(-5, 5, 50) X, Y = np.meshgrid(x, y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) figure = plt.figure(1, figsize = (12, 4)) subplot3d = plt.subplot(111, projection='3d') surface = subplot3d.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=matplotlib.cm.coolwarm, linewidth=0.1) plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
绘制三维数据另一种方法是通过等高线图。
plt.contourf(X, Y, Z, cmap=matplotlib.cm.coolwarm) plt.colorbar() plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

?
7.3 绘制气泡图 气泡图是在散点图的基础上,加了一个s参数,数量越多,则该散点形状越大。
for color in ['red', 'green', 'blue']: x, y, scale= np.random.rand(3, 100) scale = 500 * scale ** 5 plt.scatter(x, y, s=scale,c=color, alpha=0.3,edgecolors='blue') plt.show()

?
python|Python数据可视化大杀器之地阶技法(matplotlib(含详细代码))
文章图片

本章的介绍到此介绍,如果文章对你有帮助,请多多点赞、收藏、评论、关注支持!!

    推荐阅读