Matplotlib引领数据图表绘制

Matplotlib引领数据图表绘制

前言

在数据科学领域,数据可视化是一种强大的工具,能够将复杂的数据转化为易于理解和分析的图形。Matplotlib作为Python中最流行的数据可视化库,为我们提供了丰富的绘图功能和灵活的绘图选项。本文将深入探索Matplotlib。

图像得组成

下面张图片来自matplotlib官网,简单说明一下图片得组成;

  • figure:画布,一张图片得整体轮廓
  • Axes:数轴,一张画布上可以画多张图片
  • axis:坐标轴,通常得x轴,y轴等
  • tick:刻度,坐标轴上得刻度
  • title: 图片得标题
  • legend:图例
  • grid: 网格
  • label:标签说明

画图

画图之前要导入matplotlib库和numpy库;

python 复制代码
# 导入相关模块 
import matplotlib.pyplot as plt 
import numpy as np

设置 figure

Matplotlib 绘制的图形都在一个默认的 figure 中,我们可以自己创建 figure,可以控制更多的参数,常见的就是控制图形的大小

python 复制代码
plt.figure(figsize=(6, 3)) 
plt.plot(x, y) 
plt.plot(x, y * 2) 
plt.show()

设置标题

在当前图形中添加标题,可以指定标题的名称、位置、颜色、字体大小等

python 复制代码
plt.plot(x, y) 
plt.plot(x, y * 2) 
plt.title("sin(x) & 2sin(x)") 
plt.show()

设置坐标轴

  • 通过 xlim 和 ylim 来限定坐标轴的范围,只能确定一个数值区间
  • 通过 xlabel 和 ylabel 来设置坐标轴的名称
  • 通过 xticks 和 yticks 来设置坐标轴的刻度
python 复制代码
plt.plot(x, y) 
plt.plot(x, y * 2)
plt.xlim((0, np.pi + 1)) 
plt.ylim((-3, 3)) 
plt.xlabel('X') 
plt.ylabel('Y')
plt.show()
python 复制代码
plt.plot(x, y) 
plt.plot(x, y * 2) 
plt.xticks((0, np.pi * 0.5, np.pi, np.pi * 1.5, np.pi * 2)) 
plt.show()

设置 label 和 legend

为了区分出每个数据对应的图形名称

python 复制代码
plt.plot(x, y, label="sin(x)") 
plt.plot(x, y * 2, label="2sin(x)")
# plt.legend(loc=1) 
plt.legend(loc='best') 
plt.show()

图例的位置由 loc 关键字控制,其取值范围为 0-10,每个数字代表图表中的一处位置

添加注释

有时候我们需要对特定的点进行标注,我们可以使用 plt.annotate 函数来实现

这里我们要标注的点是 (x0, y0) = (π, 0)

我们也可以使用 plt.text 函数来添加注释

python 复制代码
plt.plot(x, y) 
x0 = np.pi 
y0 = 0 
# 画出标注点, s 代表点的大小 
plt.scatter(x0, y0, s=50) 
#添加文本 
plt.text(0, -0.25, "y = sin(x)", fontdict={'size': 16, 'color': 'r'}) 
#添加注释 
plt.annotate('sin(np.pi)=%s' %y0, xy=(np.pi, 0), xycoords='data', xytext=(+30, -30),textcoords='offset points', fontsize=16,             
arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2")) 
plt.show() 

对于 annotate 函数的参数,做一个简单解释:

  • 'sin(np.pi)=%s' % y0 :标注的内容,可以通过字符串 %s 将 y0 的值传入字符串
  • xycoords='data' :基于数据的值来选位置
  • xytext=(+30, -30) 和 textcoords='offset points' :对于标注位置的描述 和 xy 偏差 \值,即标注位置是   xy 位置向右移动 30,向下移动30;
  • arrowprops :对图中箭头类型和箭头弧度的设置,需要用 dict 形式传入。

使用子图

有时候我们需要将多张子图展示在一起,可以使用 ==subplot() ==实现。即在调用 plot() 函数之前需要先调用 subplot() 函数。该函数的第一个参数代表子图的总行数,第二个参数代表子图的 总列数,第三个参数代表活跃区域

python 复制代码
ax1 = plt.subplot(2, 2, 1) # (行,列,活跃区) 
plt.plot(x, np.sin(x), 'r')
ax2 = plt.subplot(2, 2, 2, sharey=ax1) # 与 ax1 共享y轴 
plt.plot(x, 2 * np.sin(x), 'g')
ax3 = plt.subplot(2, 2, 3) 
plt.plot(x, np.cos(x), 'b')
ax4 = plt.subplot(2, 2, 4, sharey=ax3) # 与 ax3 共享y轴 
plt.plot(x, 2 * np.cos(x), 'y')
plt.show()

可以看到,上面的每个子图的大小都是一样的。有时候我们需要不同大小的子图。比如将上面第一 张子图完全放置在第一行,其他的子图都放在第二行。

python 复制代码
ax1 = plt.subplot(2,1,1)
plt.plot(x,np.sin(x),'r')
ax2 = plt.subplot(2,3,4)
plt.plot(x,2*np.sin(x),'g')
ax3 = plt.subplot(2,3,5,sharey=ax2)
plt.plot(x,np.cos(x),'b')
ax4 = plt.subplot(2,3,6,sharey=ax2)
plt.plot(x,2*np.cos(x),'y')

简单解释下, plt.subplot(2, 1, 1) 将图像窗口分为了 2 行 1 列, 当前活跃区为 1。

  • 使用 plt.subplot(2, 3, 4) 将整个图像窗口分为 2 行 3 列, 当前活跃区为 4。
  • 解释下为什么活跃区为 4,因为上一步中使用 plt.subplot(2, 1, 1) 将整个图像窗口分为 2 行 1 列, 第1个小图占用了第1个位置, 也就是整个第1行. 这一步中使用 plt.subplot(2, 3, 4) 将整个图 像窗口分为 2 行 3 列, 于是整个图像窗口的第1行就变成了3列, 也就是成了3个位置, 于是第2行的 第1个位置是整个图像窗口的第4个位置

中文乱码解决

python 复制代码
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签 
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

保存图形

保存绘制的图片,可指定图片的分辨率、边缘的颜色等

python 复制代码
plt.savafig('存储文件名')  # 记得加后缀,jpg/png 等

显示图形

python 复制代码
plt.show()
python 复制代码
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(10,4),index=pd.date_range('2023/8/4',
   periods=10), columns=list('ABCD'))

df.plot()

执行上面示例代码,得到以下结果 -

如果索引由日期组成,则调用gct().autofmt_xdate()来格式化x轴,如上图所示。

我们可以使用x和y关键字绘制一列与另一列。

绘图方法允许除默认线图之外的少数绘图样式。 这些方法可以作为plot()的kind关键字参数提供。这些包括 -

  • bar或barh为条形
  • hist为直方图
  • boxplot为盒型图
  • area为"面积"
  • scatter为散点图

条形图

现在通过创建一个条形图来看看条形图是什么。条形图可以通过以下方式来创建 -

python 复制代码
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d'])
df.plot.bar()

要生成一个堆积条形图,通过指定:pass stacked=True -`

python 复制代码
import pandas as pd
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d'])
df.plot.bar(stacked=True)

要获得水平条形图,使用barh()方法 -

python 复制代码
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d'])

df.plot.barh(stacked=True)

直方图

可以使用plot.hist()方法绘制直方图。我们可以指定bins的数量值

python 复制代码
import pandas as pd
import numpy as np

df = pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

df.plot.hist(bins=20)

要为每列绘制不同的直方图,请使用以下代码 -

python 复制代码
import pandas as pd
import numpy as np

df=pd.DataFrame({'a':np.random.randn(1000)+1,'b':np.random.randn(1000),'c':
np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])

df.hist(bins=20)

散点图

可以使用DataFrame.plot.scatter()方法创建散点图。

python 复制代码
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')

饼状图

饼状图可以使用DataFrame.plot.pie()方法创建。

python 复制代码
import pandas as pd
import numpy as np

df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)

总结

Matplotlib是数据科学中不可或缺的工具,它为我们提供了丰富的绘图功能和定制选项,使得数据的可视化变得轻松而有趣。通过学习和应用Matplotlib,我们能够将复杂的数据转化为直观的图表,更好地理解数据,支持决策和分析。

相关推荐
笨鸟先飞,勤能补拙1 小时前
AI 赋能网络安全:技术全景、成熟度评估与实战案例
人工智能·python·安全·web安全·网络安全·sqlite·github
长和信泰光伏储能2 小时前
京津冀光伏发电:绿色能源的未来之路
python·能源
浦信仿真大讲堂3 小时前
从重复操作到自动化闭环:如何让 CST 与 Python 真正协同起来
python·自动化·cst·仿真软件·达索软件
Gu Gu Study3 小时前
ScoutLoop开放域深度研究引擎(agent的初步设计想法)
人工智能·python
卷无止境4 小时前
写代码这件事,到底该讲究点什么?
后端·python
卷无止境4 小时前
循环复杂度到底在算什么,Python 代码怎么才能写得让人一看就懂
后端·python
lpfasd1234 小时前
MediaCrawler 项目深度分析
chrome·python·chrome devtools
Dxy12393102165 小时前
Python项目打包成EXE完整教程(PyInstaller实战避坑)
开发语言·python
bamb005 小时前
一个项目带你入门AI应用开发01
python
0566465 小时前
Python康复训练——常用标准库
开发语言·python·学习