往期python绘图合集:
python绘制简单的折线图
python读取excel中数据并绘制多子图多组图在一张画布上
python绘制带误差棒的柱状图
python绘制多子图并单独显示
python读取excel数据并绘制多y轴图像
python绘制柱状图并美化|不同颜色填充柱子
python随机生成数据并用双y轴绘制两条带误差棒的折线图
Python绘制带误差棒的柱状图渐变色填充含数据标注(进阶)
Python 是一种极为流行的编程语言,它可以用于数据处理、机器学习和可视化等多个领域。Matplotlib 是 Python 里最受欢迎的数据可视化库之一,本文将介绍如何使用 Python 和 Matplotlib 绘制散点图。我们将从数据生成开始,涵盖绘图的各个方面,包括设置坐标轴范围、刻度和标签字体样式,以及调整图例的字体和大小等。
首先,请确保已经安装了以下库:
如果您还没有安装这些库,可以通过以下方式在命令行中安装:
pip install numpy matplotlib
在绘制散点图之前,我们需要先生成一些数据。在本篇博文中,我们将生成三组随机数据,代表全班的语文、数学和英语分数。具体来说,我们将使用 numpy 库的 random 模块生成一组包含 1000 个整数的数组,代表每个学生的分数。代码如下:
import numpy as np
nscores = 1000 # 生成 1000 个学生的分数数据
chinese_scores = np.random.randint(50, 100, size=nscores)
math_scores = np.random.randint(40, 90, size=nscores)
english_scores = np.random.randint(60, 100, size=nscores)
使用 numpy 库的 random 模块生成了三组随机数据,分别代表全班的语文、数学和英语分数。其中,randint() 函数用于生成指定范围内的随机整数。这里我们将语文分数限制在 50 到 100 之间(不包括 100),将数学分数限制在 40 到 90 之间(不包括 90),将英语分数限制在 60 到 100 之间(不包括 100)。
使用 Matplotlib 的 scatter() 函数绘制散点图。具体来说,我们将使用 scatter() 函数三次,分别绘制语文分数与数学分数、语文分数与英语分数以及数学分数与英语分数之间的关系。代码如下:
import matplotlib.pyplot as plt
# 创建画布和子图
fig, ax = plt.subplots()
# 绘制散点图
ax.scatter(chinese_scores, math_scores, s=20, alpha=0.8, label='Chinese and Math')
ax.scatter(chinese_scores, english_scores, s=20, alpha=0.8, label='Chinese and English')
ax.scatter(math_scores, english_scores, s=20, alpha=0.8, label='Math and English')
# 展示图形
plt.show()
解释:用了 matplotlib.pyplot 模块的 subplots() 函数创建了一个画布和一个子图。然后,我们分别调用了三次 scatter() 函数,传递了相应的参数。其中,s 参数指定散点的大小,alpha 参数指定散点的透明度,label 参数指定每组数据的标签。
进一步美化图表,比如设置坐标轴范围、刻度和标签字体样式
在散点图中,通常需要设置坐标轴的范围以确保数据能够显示在图表中。在 Matplotlib 中,我们可以使用 set_xlim() 和 set_ylim() 函数来设置 x 轴和 y 轴的范围。例如,如果我们希望 x 轴的范围在 0 到 100 之间,y 轴的范围在 20 到 100 之间,那么可以按照以下方式修改代码:
ax.set_xlim(0, 100)
ax.set_ylim(20, 100)
在散点图中,可能需要设置不同的刻度大小以更好地展示数据。在 Matplotlib 中,我们可以使用 set_xticks() 和 set_yticks() 函数来设置 x 轴和 y 轴的刻度位置。例如,如果我们希望 x 轴和 y 轴每隔 10 个单位就显示一个刻度,那么可以按照以下方式修改代码:
ax.set_xticks(range(0, 101, 10))
ax.set_yticks(range(20, 101, 10))
在散点图中,需要给 x 轴和 y 轴分别添加标签以说明数据含义。在 Matplotlib 中,我们可以使用 set_xlabel() 和 set_ylabel() 函数来添加标签,并使用 fontname 参数指定标签字体。例如,如果我们想要将 x 轴标签设置为“语文分数”,将 y 轴标签设置为“数学分数/英语分数”,并将标签字体设置为 Times New Roman,那么可以按照以下方式修改代码:
ax.set_xlabel('Chinese Scores', fontname='Times New Roman')
ax.set_ylabel('Math Scores / English Scores', fontname='Times New Roman')
for tick in ax.get_xticklabels():
tick.set_fontname("Times New Roman")
for tick in ax.get_yticklabels():
tick.set_fontname("Times New Roman")
得到了如下完整的代码,其中包括数据生成、绘图、设置坐标轴范围、刻度和标签字体样式,以及调整图例的字体和大小等步骤。
import matplotlib.pyplot as plt
import numpy as np
font = {'family':'Times New Roman','size':14}
# 生成三组随机数据,代表全班的语文、数学和英语分数
nscores = 60 # 生成 60 个学生的分数数据
chinese_scores = np.random.randint(50, 100, size=nscores)
math_scores = np.random.randint(40, 90, size=nscores)
english_scores = np.random.randint(60, 100, size=nscores)
# 创建画布和子图
fig, ax = plt.subplots(figsize=(8,5),dpi = 600)
# 绘制散点图,并指定不同颜色、大小和透明度
x = np.arange(nscores)
y = x
s1 = 3*chinese_scores # 大小与分数相关
s2 = math_scores*2
s3 = english_scores *1
c1 = chinese_scores # 颜色深浅与温度相关
c2 = math_scores
c3 = english_scores
ax.scatter(chinese_scores, math_scores, s=s1, c=c1, cmap='coolwarm', norm=plt.Normalize(vmin=0, vmax=1), alpha=0.8, label='Chinese')
ax.scatter(chinese_scores, english_scores, s=s2, c=c2, cmap='PiYG', norm=plt.Normalize(vmin=0, vmax=1), alpha=0.8, label='Math')
ax.scatter(math_scores, english_scores, s=s3, c=c3, cmap='rainbow', norm=plt.Normalize(vmin=0, vmax=1), alpha=0.8, label='English')
# 设置坐标轴范围、刻度和标签字体样式
ax.set_xlim(40, 100)
ax.set_ylim(40, 110)
ax.set_xticks(range(40, 110, 10))
ax.set_yticks(range(40, 110, 10))
plt.rcParams['font.family'] = 'serif'
plt.rcParams['font.size'] = 20
ax.set_xlabel('Chinese Scores', fontname='Times New Roman')
ax.set_ylabel('Math Scores / English Scores', fontname='Times New Roman')
for tick in ax.get_xticklabels():
tick.set_fontname("Times New Roman")
for tick in ax.get_yticklabels():
tick.set_fontname("Times New Roman")
ax.legend(ncol=3,loc=1,prop=font)
plt.tight_layout()
# plt.savefig('散点图.jpg')
# 展示图形
plt.show()