如何在Python Matplotlib中绘制自定义颜色和大小的4D散点图?
介绍..
当用两个维度表示数据并验证两个变量之间是否存在关系时,散点图非常有用。散点图是一个图表,其中数据以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..与Matplotlib的其他方法一样,“.scatter”的参数需要X和Y值的数组。
- 注意 - * X和Y值需要具有相同的大小,并且默认情况下将数据转换为浮点值。
plt.scatter(titles, players)
<matplotlib.collections.PathCollection at 0x28df3684ac0>
5.哦,我的大满贯称号在x轴上绘制为浮点数。我将它们转换为整数,并在下面的函数中添加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('大满贯成就')
plt.ylabel('网球选手')
plt.scatter(titles, players)
6.不要将散点图仅视为二维图表,散点图还可以添加第三个(区域)甚至第四个维度(颜色)。让我稍微解释一下我将在下面做什么。
首先,我们将定义自己的颜色,然后通过随机选择颜色并将其分配给您的值循环遍历它们。α系数使每个点半透明,使我们可以看到它们重叠的位置。这个值越高,点就越不透明。
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('大满贯成就')
plt.ylabel('网球选手')
plt.scatter(titles, players, c=color, s=size, alpha=0.1)
<matplotlib.collections.PathCollection at 0x28df22e2430>
记住,图表的终极目标是使数据易于理解。
我展示了散点图的基础知识。甚至可以做更多的事情,例如,使颜色与大小相关,使相同大小的点具有相同的颜色,这可能有助于我们区分数据。
最后,将所有内容整合在一起。
例子
# 导入
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('大满贯头衔')
plt.ylabel('网球运动员')
plt.scatter(titles, players, c=color, s=size, alpha=0.1)
<matplotlib.collections.PathCollection at 0x2aa7676b670>