Matplotlib数据图形绘制大全
Matplotlib是一个用于绘制图形的Python库。它可以在各种平台上生成静态图、动态图、交互式图形和幻灯片。它可以用于绘制线图、散点图、柱状图、饼图、直方图等各种图形。它还可以与其他Python库,如NumPy、Pandas等一起使用。
安装
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
时,可以设置此参数来控制边界周围保留的空白边缘大小(以英寸为单位)。facecolor
和edgecolor
:分别设置保存图像的背景色和边框颜色。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()