Matplotlib是一个用于绘制图形的Python库。它可以在各种平台上生成静态图、动态图、交互式图形和幻灯片。它可以用于绘制线图、散点图、柱状图、饼图、直方图等各种图形。它还可以与其他Python库,如NumPy、Pandas等一起使用。

参考:Matplotlib 教程 | 菜鸟教程 (runoob.com)

安装

pip install matplotlib seaborn

创建图表

创建一个新的图形(figure)时,如下代码示例:

import matplotlib.pyplot as plt

# 创建一个新的图形
fig = plt.figure()

# 现在可以在这个图形上绘制内容
plt.plot([1, 2, 3, 4])
plt.show()

plt.figure() 是 Matplotlib 库中的一个函数,用于创建一个新的图形(figure)。当你想要绘制多个图表,或者需要对图表的属性进行更细致控制时,这个函数非常有用。

通常,在进行一个图表的绘制时,不需要plt.figure(),例如:

import matplotlib.pyplot as plt

# 数据
x = [1, 2, 3, 4, 5]
y = [1, 4, 9, 16, 25]

# 创建折线图
plt.plot(x, y)

# 显示图表
plt.show()

现在介绍plt.figure()的用法

不带任何参数调用 plt.figure() 会创建一个新的空白图形,并且返回一个 Figure 对象。默认情况下,Matplotlib 会自动管理这个图形的编号和尺寸。

import matplotlib.pyplot as plt

# 创建一个新的图形
fig = plt.figure()

# 现在可以在这个图形上绘制内容
plt.plot([1, 2, 3, 4])
plt.show()

你可以通过向 plt.figure() 传递参数来自定义新图形的属性,例如尺寸、分辨率、背景色等。

# 创建一个宽度为10英寸,高度为5英寸的图形
fig = plt.figure(figsize=(10, 5))

# 绘制内容...

创建子图

plt.figure() 也常与 add_subplot()subplots() 结合使用来创建具有多个子图的复杂布局。

# 创建一个包含2行1列的子图布局,并激活第一个子图
fig = plt.figure()
ax1 = fig.add_subplot(2, 1, 1)

# 在第一个子图上绘制内容
ax1.plot([1, 2, 3, 4])

# 激活第二个子图
ax2 = fig.add_subplot(2, 1, 2)

# 在第二个子图上绘制内容
ax2.bar([1, 2, 3], [4, 5, 6])

plt.show()

当你调用 fig.add_subplot(2, 1, 1) 时,你是在一个2行1列的网格布局中添加第一个子图。这个函数的三个参数分别代表:

  • 总行数(row)

  • 总列数(column)

  • 当前激活的子图索引(从1开始计数)

如果你想要调整这个布局或者添加更多子图,你可以修改这些参数。例如:

  • 要创建一个2行2列的网格布局,并且添加左上角的第一个子图,可以使用 fig.add_subplot(2, 2, 1)

  • 若要在上述2x2网格中紧接着添加右上角的第二个子图,可以使用 fig.add_subplot(2, 2, 2)

  • 如果你想在新的一行开始,比如添加一个占据两列的子图在下一行,可以先增加总行数,然后使用 fig.add_subplot(3, 1, 3) 或者对于跨越列的情况使用 fig.add_subplot(1, 2, 1) 并调整其宽度比。

或者使用 subplots() 函数更简洁地创建并访问子图:

fig, axs = plt.subplots(2, 1)

axs[0].plot([1, 2, 3, 4])
axs[1].bar([1, 2, 3], [4, 5, 6])

plt.show()

当你使用 fig, axs = plt.subplots(2, 1) 这样的代码时,你在一步操作中创建了一个带有2行1列网格布局的Figure对象,并且同时获取了这个布局中所有子图的轴(axes)对象列表。这意味着axs会是一个包含两个子图轴对象的数组(list),其中axs[0]对应第一行的第一个子图,axs[1]对应第二行的第一个子图。

这种语法简化了单独调用fig.add_subplot()的过程,特别是当需要处理多个子图时。接下来,你可以直接对axs中的各个元素进行操作,来分别设置每个子图的属性、绘制数据等

matplotlib图表绘制

基本绘制

折线图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# x = [1, 2, 3, 4, 5]
# x = pd.Series([1, 2, 3, 4, 5])
x = np.array([1, 2, 3, 4, 5])
# y = [2, 4, 6, 8, 10]
# y = pd.Series([2, 4, 6, 8, 10])
y = np.array([2, 4, 6, 8, 10])

plt.plot(x, y) # x和y可以是列表、numpy的列表或者pandas的序列
plt.show()

可以在同一张图里面画多个图表

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [3, 6, 9, 12, 15]

plt.plot(x, y1)
plt.plot(x, y2)
plt.show()

散点图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# x = [1, 2, 3, 4, 5]
# x = pd.Series([1, 2, 3, 4, 5])
x = np.array([1, 2, 3, 4, 5])
# y = [2, 4, 6, 8, 10]
# y = pd.Series([2, 4, 6, 8, 10])
y = np.array([2, 4, 6, 8, 10])

plt.scatter(x, y) # x和y可以是列表、numpy的列表或者pandas的序列
plt.show()

直方图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# x = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# x = pd.Series([2, 4, 6, 8, 10, 12, 14, 16, 18, 20])
x = np.array([2, 4, 6, 8, 10, 12, 14, 16, 18, 20])

plt.hist(x) # x可以是列表、numpy的列表或者pandas的序列
plt.show()

条形图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# x = [1, 2, 3, 4, 5]
# x = pd.Series([1, 2, 3, 4, 5])
x = np.array([1, 2, 3, 4, 5])
# y = [2, 4, 6, 8, 10]
# y = pd.Series([2, 4, 6, 8, 10])
y = np.array([2, 4, 6, 8, 10])

plt.bar(x, y) # x和y可以是列表、numpy的列表或者pandas的序列
plt.show()

饼图

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# labels = ['Apple', 'Banana', 'Orange', 'Strawberry']
# labels = pd.Series(['Apple', 'Banana', 'Orange', 'Strawberry'])
labels = np.array(['Apple', 'Banana', 'Orange', 'Strawberry'])

# sizes = [20, 30, 40, 10]
# sizes = pd.Series([20, 30, 40, 10])
sizes = np.array([20, 30, 40, 10])

plt.pie(sizes, labels=labels) # sizes和labels可以是列表、numpy的列表或者pandas的序列
plt.show()

图表样式调整

中文显示

由于默认情况下matplotlib对中文显示支持不太友好,需要指定一个支持中文的字体文件

确保系统上有一个支持中文的字体,比如SimHei.ttf(黑体),你可以从操作系统中选择一个已有的中文字体,或者在网上下载一个。

首先获取系统上的字体库列表

from matplotlib import pyplot as plt
import matplotlib
a=sorted([f.name for f in matplotlib.font_manager.fontManager.ttflist])

for i in a:
    print(i)

然后,在代码中加入以下设置,以便matplotlib能够正确显示中文字符:

import matplotlib.pyplot as plt

# 设置中文字体
plt.rcParams['font.sans-serif']='SimHei' # 用黑体显示中文
plt.rcParams['axes.unicode_minus']=False # 解决保存图像是负号'-'显示为方块的问题

设置标题和坐标轴标签

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.title('My Plot') # 设置图表标题
plt.xlabel('X-axis') # 设置图表的x标签
plt.ylabel('Y-axis') # 设置图表的y标签
plt.show()

设置坐标轴范围

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.xlim(0, 6) # 设置图表的x范围
plt.ylim(0, 12) # 设置图表的y范围
plt.show()

修改标签

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, label='Line 1') # 标记这条线的标签为Line 1
plt.show()

修改颜色和线条样式

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y, color='green', linestyle='dashed') # 标记这条线的颜色为绿色,线条样式为虚线
plt.show()

颜色(color)可以指定为颜色名、RGB/A元组或十六进制颜色代码。以下是一些常用的颜色名:

  • blue :蓝色

  • green :绿色

  • red :红色

  • cyan :青色

  • magenta :洋红

  • yellow :黄色

  • black :黑色

  • white :白色

也可以使用如#RRGGBB形式的六位十六进制颜色代码,或者#RRGGBBAA八位代码来指定带透明度的颜色。

此外,还可以直接用RGB或RGBA元组,例如(0.2, 0.3, 0.4)(0.2, 0.3, 0.4, 0.5),其中最后一个值(如果存在)代表透明度。

线型(linestyle)用来控制线条的样式,包括但不限于:

  • - solid:实线(默认)

  • --dashed :虚线

  • -.dashdot:点划线

  • :dotted:点线

  • none 或 :无线型

设置图例

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [3, 6, 9, 12, 15]

plt.plot(x, y1, label='Line 1')
plt.plot(x, y2, label='Line 2')
plt.legend() # 设置图例,会在图标上标名是哪条线
plt.show()

修改坐标轴刻度

import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

plt.plot(x, y)
plt.xticks([1, 2, 3, 4, 5], ['a', 'b', 'c', 'd', 'e']) # 设置x坐标轴刻度
plt.yticks([2, 4, 6, 8, 10], ['low', 'medium', 'high', 'very high', 'extremely high']) # 设置y坐标轴刻度
plt.show()

保存图表

在我们需要保存图表时,我们可以调用plt.savefig() 去保存我们绘制的图表

下面是一些关于如何使用 plt.savefig() 的基本信息和常用参数

plt.savefig(filename, dpi=None, format=None, metadata=None, bbox_inches=None, pad_inches=0.1, facecolor='auto', edgecolor='auto', backend=None, **kwargs)
  • filename:字符串类型,指定保存图像的文件名。你可以包括文件扩展名来指定保存格式,例如 .png, .pdf, .svg 等。如果不指定,Matplotlib 将根据提供的格式参数或默认格式进行推断。

  • dpi:每英寸点数 (dots per inch),用于设置图像的分辨率。默认值取决于 rcParams 设置,通常为 100。增加 dpi 可以得到更清晰但更大的文件。

  • format:字符串类型,指定保存图像的格式,如 png, pdf, svg 等。如果不提供,Matplotlib 将尝试从文件名中推断。

  • bbox_inches:控制保存时要考虑的边界框。设置为 tight 会自动调整边界以紧密包围所有绘图元素,去除多余的空白区域。

  • pad_inches:当 bbox_inches 设置为 tight 时,可以设置此参数来控制边界周围保留的空白边缘大小(以英寸为单位)。

  • facecoloredgecolor:分别设置保存图像的背景色和边框颜色。

  • metadata:字典类型,允许你添加元数据到保存的图像中,这依赖于所选的输出格式。

  • backend:可选的,指定用于保存图像的后端。通常不需要设置,除非你遇到了特定后端相关的保存问题。

例如,保存一个简单的图表为PNG文件,同时设置高DPI和自动调整边界:

import matplotlib.pyplot as plt

# 创建一个简单的图表
plt.plot([0, 1, 2, 3, 4], [0, 1, 4, 9, 16])

# 保存图表
plt.savefig('my_figure_highres.png', dpi=300, bbox_inches='tight')

# 显示图表(如果需要)
plt.show()

# 清理资源
plt.close()

文章作者: Vsoapmac
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soap的会员制餐厅
数据分析 个人分享 第三方库 数据分析
喜欢就支持一下吧