python绘制散点图|散点大小和颜色深浅由数值决定

27 篇文章 5 订阅
14 篇文章 7 订阅

python绘图系列文章目录

往期python绘图合集:
python绘制简单的折线图
python读取excel中数据并绘制多子图多组图在一张画布上
python绘制带误差棒的柱状图
python绘制多子图并单独显示
python读取excel数据并绘制多y轴图像
python绘制柱状图并美化|不同颜色填充柱子
python随机生成数据并用双y轴绘制两条带误差棒的折线图
Python绘制带误差棒的柱状图渐变色填充含数据标注(进阶)


一、简介

Python 是一种极为流行的编程语言,它可以用于数据处理、机器学习和可视化等多个领域。Matplotlib 是 Python 里最受欢迎的数据可视化库之一,本文将介绍如何使用 Python 和 Matplotlib 绘制散点图。我们将从数据生成开始,涵盖绘图的各个方面,包括设置坐标轴范围、刻度和标签字体样式,以及调整图例的字体和大小等。
首先,请确保已经安装了以下库:

  1. Python 3.x
  2. NumPy
  3. 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 参数指定每组数据的标签。

四、设置坐标轴范围、刻度和标签字体样式

进一步美化图表,比如设置坐标轴范围、刻度和标签字体样式

4.1 设置坐标轴范围

在散点图中,通常需要设置坐标轴的范围以确保数据能够显示在图表中。在 Matplotlib 中,我们可以使用 set_xlim() 和 set_ylim() 函数来设置 x 轴和 y 轴的范围。例如,如果我们希望 x 轴的范围在 0 到 100 之间,y 轴的范围在 20 到 100 之间,那么可以按照以下方式修改代码:

ax.set_xlim(0, 100)
ax.set_ylim(20, 100)

4.2 设置坐标轴刻度

在散点图中,可能需要设置不同的刻度大小以更好地展示数据。在 Matplotlib 中,我们可以使用 set_xticks() 和 set_yticks() 函数来设置 x 轴和 y 轴的刻度位置。例如,如果我们希望 x 轴和 y 轴每隔 10 个单位就显示一个刻度,那么可以按照以下方式修改代码:

ax.set_xticks(range(0, 101, 10))
ax.set_yticks(range(20, 101, 10))

4.3 设置坐标轴标签字体样式

在散点图中,需要给 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()


六、 运行结果

在这里插入图片描述

  • 5
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

群智能算法小狂人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值