Python之matplotlib 基础三:绘制折线图
上效果:
import matplotlib.pyplot as plt
import matplotlibmatplotlib.use('TkAgg') # 设置后端为 TkAgg,使得程序可以在 Tkinter 窗口中显示# 使用xkcd风格,使得图形更有漫画风格
plt.xkcd()# 设置支持 CJK 字符的字体(例如:微软雅黑),保证图形中的中文能够正确显示
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'ages_x = [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]py_dev_y = [20046, 17100, 20000, 24744, 30500, 37732, 41247, 45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640, 84666,84392, 78254, 85000, 87038, 91991, 100000, 94796, 97962, 93302, 99240, 102736, 112285, 100771, 104708, 108423, 101407, 112542, 122870, 120000]
plt.plot(ages_x, py_dev_y, label='Python')js_dev_y = [16446, 16791, 18942, 21780, 25704, 29000, 34372, 37810, 43515, 46823, 49293, 53437, 56373, 62375, 66674, 68745, 68746, 74583, 79000,78508, 79996, 80403, 83820, 88833, 91660, 87892, 96243, 90000, 99313, 91660, 102264, 100000, 100000, 91660, 99240, 108000, 105000, 104000]
plt.plot(ages_x, js_dev_y, label='JavaScript')dev_y = [17784, 16500, 18012, 20628, 25206, 30252, 34368, 38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752, 77232,78000, 78508, 79536, 82488, 88935, 90000, 90056, 95000, 90000, 91633, 91660, 98150, 98964, 100000, 98988, 100000, 108923, 105000, 103117]
plt.plot(ages_x, dev_y, color='#444444', linestyle='--', label='All Devs')plt.xlabel('年龄')
plt.ylabel('薪资统计 (元)')
plt.title('薪资统计 (元) --年龄段')plt.legend()plt.tight_layout()plt.savefig('plot.png')plt.show()
这里值得说一下的是:
xkcd 风格会使用 matplotlib 自带的一些特殊字体,并且这些字体可能不支持 CJK 字符(如中文、日文和韩文)。
解决方法:
要在 xkcd 风格下正确显示中文,您可以手动设置支持 CJK 字符的字体。例如,在使用 plt.xkcd() 后,重新设置字体为 Microsoft YaHei 或其他支持中文的字体。
这段代码使用了 matplotlib
库,目的是生成一个带有三条线的图表,展示不同编程语言(Python、JavaScript)以及所有开发者薪资随着年龄变化的关系,并使用 xkcd
风格进行绘制。下面将逐步分析这段代码,以及其中用到的语法。
代码解析:
import matplotlib.pyplot as plt
import matplotlib
import matplotlib.pyplot as plt
:导入matplotlib
的pyplot
模块,用于创建和管理图形。pyplot
提供了类似 MATLAB 的接口,简化了图形的绘制过程。import matplotlib
:导入matplotlib
,但此处实际没有使用。可以省略。
matplotlib.use('TkAgg') # 设置后端为 TkAgg,使得程序可以在 Tkinter 窗口中显示
matplotlib.use('TkAgg')
:设置图形显示的后端为 TkAgg,这使得图形可以嵌入到 Tkinter 窗口中进行显示。TkAgg
是一种常用的图形后端,支持在 GUI 窗口中显示图形。
# 使用xkcd风格,使得图形更有漫画风格
plt.xkcd()
plt.xkcd()
:启用 xkcd 风格,使图形呈现漫画风格。该风格使得绘制的图形具有手绘效果,增加了趣味性。
# 设置支持 CJK 字符的字体(例如:微软雅黑),保证图形中的中文能够正确显示
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
matplotlib.rcParams['font.family']
:设置全局字体为Microsoft YaHei
(微软雅黑),确保图形中的中文能够正确显示。如果不设置,可能会出现中文无法显示的问题。
ages_x = [18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55]
ages_x
:定义了一个列表,表示年龄段。这些值将作为横坐标(x
轴)。
py_dev_y = [20046, 17100, 20000, 24744, 30500, 37732, 41247, 45372, 48876, 53850, 57287, 63016, 65998, 70003, 70000, 71496, 75370, 83640, 84666,84392, 78254, 85000, 87038, 91991, 100000, 94796, 97962, 93302, 99240, 102736, 112285, 100771, 104708, 108423, 101407, 112542, 122870, 120000]
py_dev_y
:定义了一个列表,表示与ages_x
中的每个年龄段对应的 Python 开发者的薪资。这个数据将作为纵坐标(y
轴)。
plt.plot(ages_x, py_dev_y, label='Python')
plt.plot(ages_x, py_dev_y, label='Python')
:绘制ages_x
和py_dev_y
之间的关系曲线,并为该曲线添加标签'Python'
,这将在图例中显示。
js_dev_y = [16446, 16791, 18942, 21780, 25704, 29000, 34372, 37810, 43515, 46823, 49293, 53437, 56373, 62375, 66674, 68745, 68746, 74583, 79000,78508, 79996, 80403, 83820, 88833, 91660, 87892, 96243, 90000, 99313, 91660, 102264, 100000, 100000, 91660, 99240, 108000, 105000, 104000]
js_dev_y
:定义了一个列表,表示 JavaScript 开发者的薪资数据,和ages_x
对应。
plt.plot(ages_x, js_dev_y, label='JavaScript')
plt.plot(ages_x, js_dev_y, label='JavaScript')
:绘制 JavaScript 开发者的薪资曲线,并为该曲线添加标签'JavaScript'
。
dev_y = [17784, 16500, 18012, 20628, 25206, 30252, 34368, 38496, 42000, 46752, 49320, 53200, 56000, 62316, 64928, 67317, 68748, 73752, 77232,78000, 78508, 79536, 82488, 88935, 90000, 90056, 95000, 90000, 91633, 91660, 98150, 98964, 100000, 98988, 100000, 108923, 105000, 103117]
dev_y
:定义了一个列表,表示所有开发者的薪资数据。
plt.plot(ages_x, dev_y, color='#444444', linestyle='--', label='All Devs')
plt.plot(ages_x, dev_y, color='#444444', linestyle='--', label='All Devs')
:绘制所有开发者的薪资曲线,使用灰色虚线,并为该曲线添加标签'All Devs'
。
plt.xlabel('年龄')
plt.ylabel('薪资统计 (元)')
plt.title('薪资统计 (元) --年龄段')
plt.xlabel('年龄')
:设置x
轴标签为 ‘年龄’。plt.ylabel('薪资统计 (元)')
:设置y
轴标签为 ‘薪资统计 (元)’。plt.title('薪资统计 (元) --年龄段')
:设置图表的标题为 ‘薪资统计 (元) --年龄段’。
plt.legend()
plt.legend()
:显示图例,图例会显示在图表的一个区域,标注每条曲线所代表的内容。
plt.tight_layout()
plt.tight_layout()
:调整图形布局,确保各部分(如标题、坐标轴标签、图例等)不重叠。
plt.savefig('plot.png')
plt.savefig('plot.png')
:将生成的图形保存为plot.png
文件。
plt.show()
plt.show()
:显示图形。
语法解析:
plt.plot()
:用来绘制图表,接受数据(x, y)、颜色、线型、标签等参数。label
:在plt.plot()
中用于为每条曲线指定一个标签,这些标签会显示在图例中。plt.xlabel()
,plt.ylabel()
,plt.title()
:分别设置x
轴标签、y
轴标签和图形标题。plt.legend()
:显示图例,帮助标识不同曲线的含义。plt.tight_layout()
:自动调整子图参数,使得图表更紧凑,避免重叠。
总结:
这段代码绘制了三条曲线,分别表示不同编程语言(Python、JavaScript)和所有开发者的薪资随年龄变化的关系。使用了 xkcd
风格来增加图形的漫画效果,调整了图形中的中文显示并保存图形为文件。
如下图是尝试了几种统计图格式“:
格式1:
格式2:
格式3:
格式4:
、
import matplotlib
matplotlib.use('TkAgg') # 设置后端为 TkAgg,使得程序可以在 Tkinter 窗口中显示
# 使用xkcd风格,使得图形更有漫画风格
# plt.xkcd()
# 设置支持 CJK 字符的字体(例如:微软雅黑),保证图形中的中文能够正确显示
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'# plt.style.use('ggplot')
plt.style.use("fivethirtyeight")
ages_x = [25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35]dev_y = [38496, 42000, 46752, 49320, 53200,56000, 62316, 64928, 67317, 68748, 73752]# 格式1
# plt.plot(ages_x, dev_y, color="#444444", label="All Devs")
# 格式2
# plt.plot(ages_x, dev_y,color='red', linestyle='-', marker='o',label="平均薪资")
# 格式3
# plt.plot(ages_x, dev_y,color='red', linestyle='--', marker='o',label="平均薪资")
# 格式4
plt.plot(ages_x, dev_y,color='red', linestyle='dashed', marker='+',label="平均薪资")plt.legend()plt.title("薪资统计 (元) -- 年龄段")
plt.xlabel("年龄")
plt.ylabel("薪资统计 (元)")plt.tight_layout()
plt.savefig("MatplotlibS002_格式4.png")plt.show()