如何在 Python Matplotlib 中绘制具有自定义颜色和自定义区域大小的 4D 散点图?

pythonserver side programmingprogramming更新于 2026/2/15 20:28:17

简介..

散点图在用二维表示数据以验证两个变量之间是否存在任何关系时非常有用。散点图是一种图表,其中数据以具有 X 和 Y 值的点表示。

如何做到这一点..

1. 通过以下命令安装 matplotlib。

pip install matplotlib

2. 导入 matplotlib

import matplotlib.pyplot as plt
tennis_stats = (('Federer', 20),('Nadal', 20),('Djokovic', 17),('Sampras', 14),('Emerson', 12),('laver', 11),('Murray', 3),('Wawrinka', 3),('Zverev', 0),('Theim', 1),('Medvedev',0),('Tsitsipas', 0),('Dimitrov', 0),('Rublev', 0))

3. 下一步是准备任何数组格式的数据。我们还可以从数据库或电子表格中读取数据,并按以下格式格式化数据。

titles = [title for player, title in tennis_stats]
players = [player for player, title in tennis_stats]

4. .scatter 的参数与 matplotlib 的其他方法一样,需要一个 X 和 Y 值数组。

*注意 -* X 和 Y 值都需要大小相同,并且数据默认转换为浮点数。

plt.scatter(titles, players)


<matplotlib.collections.PathCollection at 0x28df3684ac0>

5. 哦,我在 x 轴上绘制的 GrandSlam 标题是浮点数。我将把它们转换为整数,并在下面的函数中为 x 轴和 y 轴添加标题。轴格式化程序将被 .set_major_formatter 覆盖。

from matplotlib.ticker import FuncFormatter
def format_titles(title, pos):
return '{}'.format(int(title))

plt.gca().xaxis.set_major_formatter(FuncFormatter(format_titles))
plt.xlabel('Grandslam Titles')
plt.ylabel('Tennis Player')
plt.scatter(titles, players)

6. 不要将散点图视为二维图表,散点图还可以添加第三维(区域)甚至第四维(颜色)。下面让我解释一下我将要做什么。

首先,我们将定义您选择的颜色,然后循环随机选择颜色并为其分配值。

alpha 值使每个点都半透明,使我们能够看到它们重叠的位置。此值越高,点的透明度就越低。

import random

# 定义您自己的颜色比例。
random_colors = ['#FF0000', '#FFFF00', '#FFFFF0', '#FFFFFF', '#00000F']

# 设置与我们的数据值相似的颜色数量
color = [random.choice(random_colors) for _ in range(len(titles))]

plt.scatter(titles, players, c=color, alpha=0.5)


<matplotlib.collections.PathCollection at 0x28df2242d00>

7. 现在,让我们将表示的尺寸/区域稍微放大一点。

import random

# 定义您自己的颜色标度。
random_colors = ['#FF0000', '#FFFF00', '#FFFFF0', '#FFFFFF', '#00000F']

# 设置与我们的数据值相似的颜色数量
color = [random.choice(random_colors) for _ in range(len(titles))]

# 设置大小
size = [(50 * random.random()) ** 2 for _ in range(len(titles))]

plt.gca().xaxis.set_major_formatter(FuncFormatter(format_titles))
plt.xlabel('Grandslam Titles')
plt.ylabel('Tennis Player')

plt.scatter(titles, players, c=color, s=size, alpha=0.1))


<matplotlib.collections.PathCollection at 0x28df22e2430>

请记住,图表的最终目标是使数据易于理解。

我已经展示了使用散点图可以做什么的基本知识。例如,您可以做更多,使颜色取决于大小,使所有相同大小的点具有相同的颜色,这可能有助于我们区分数据。

探索更多 - https://matplotlib.org/。

最后,将所有内容放在一起。

示例

# imports
import matplotlib.pyplot as plt
import random

# 准备数据..
tennis_stats = (('Federer', 20),('Nadal', 20),('Djokovic', 17),('Sampras', 14),('Emerson', 12),('laver', 11),('Murray', 3),('Wawrinka', 3),('Zverev', 0),('Theim', 1),('Medvedev',0),('Tsitsipas', 0),('Dimitrov', 0),('Rublev', 0))

titles = [title for player, title in tennis_stats]
players = [player for player, title in tennis_stats]

# 自定义函数
from matplotlib.ticker import FuncFormatter
def format_titles(title, pos):
return '{}'.format(int(title))

# 定义您自己的颜色比例。
random_colors = ['#FF0000', '#FFFF00', '#FFFFF0', '#FFFFFF', '#00000F']

# 设置与我们的数据值相似的颜色数量
color = [random.choice(random_colors) for _ in range(len(titles))]

# 设置大小
size = [(50 * random.random()) ** 2 for _ in range(len(titles))]

plt.gca().xaxis.set_major_formatter(FuncFormatter(format_titles))
plt.xlabel('Grandslam Titles')
plt.ylabel('Tennis Player')

plt.scatter(titles, players, c=color, s=size, alpha=0.1)


<matplotlib.collections.PathCollection at 0x2aa7676b670>


相关文章


有用资源