Python 散点图分类别标签+不同颜色区分


1. 前言

在散点图中,我们有时候希望把不同类别的点用不同颜色区分,并且不同类别有图例标签标明,实现类似如下的结果:
在这里插入图片描述

2. 实现

2.1 构建数据对

首先构建好 label -> (x, y) 的映射数据 Map,这一步是根据你的实际情况提前构建的,一般数据都是动态的,最终构建的数据格式:

label_to_xy = {
   "label_A": [[1, 2, 3, 4, 5, 5, 3, 2], [2, 1, 3, 5, 4, 3, 4, 3]],
   "label_B": [[10, 11, 12, 13, 14, 13, 12, 11], [15, 16, 13, 10, 14, 15, 13, 12]],
   "label_C": [[8, 7, 8, 7, 8, 9], [10, 8, 9, 9, 10, 8]]
}

其中,列表中第一个是 x 轴坐标列表,第二个是 y 轴坐标列表。

2.2 构建colors_map

紧接着,根据构建好的数据,动态构建 colors_map,用于绘制不同颜色的点:

import math
import random
import matplotlib.pyplot as plt

all_colors, colors_map = [], {}
for label in label_to_xy.keys():
   color = generate_random_color(min_distance=0.3, previous_colors=all_colors)
   all_colors.append(color)
   colors_map[label] = color

def generate_random_color(min_distance=0.2, previous_colors=None, max_attempts=100):
    """
    生成一个带有足够颜色通道差异的随机RGB颜色,确保与之前生成的颜色不相邻
    """
    def color_distance(color1, color2):
        """计算两个颜色之间的欧氏距离"""
        return math.sqrt(sum((c1 - c2) ** 2 for c1, c2 in zip(color1, color2)))

    if previous_colors is None:
        previous_colors = []

    if not previous_colors:
        return (random.random(), random.random(), random.random())

    while True:
        r = random.random()
        g = random.random()
        b = random.random()

        min_distance_to_previous = min(color_distance(new_color, prev_color) for new_color in ((r, g, b),) for prev_color in previous_colors)
        if min_distance_to_previous >= min_distance:
            return (r, g, b)

2.3 绘制图

import math
import random
import matplotlib.pyplot as plt

plt.figure()
for l, xy in label_to_xy.items():
    plt.scatter(xy[0], xy[1], label=l, c=[colors_map[l]])
plt.legend()
plt.show()

3. 完整示例

import math
import random
import matplotlib.pyplot as plt


def draw_pic(label_to_xy):
    all_colors, colors_map = [], {}
    for label in label_to_xy.keys():
        color = generate_random_color(min_distance=0.3, previous_colors=all_colors)
        all_colors.append(color)
        colors_map[label] = color

    plt.figure()
    for l, xy in label_to_xy.items():
        plt.scatter(xy[0], xy[1], label=l, c=[colors_map[l]])
    plt.legend()
    plt.show()


def generate_random_color(min_distance=0.2, previous_colors=None, max_attempts=100):
    """
    生成一个带有足够颜色通道差异的随机RGB颜色,确保与之前生成的颜色不相邻
    """
    def color_distance(color1, color2):
        """计算两个颜色之间的欧氏距离"""
        return math.sqrt(sum((c1 - c2) ** 2 for c1, c2 in zip(color1, color2)))

    if previous_colors is None:
        previous_colors = []

    if not previous_colors:
        return (random.random(), random.random(), random.random())

    while True:
        r = random.random()
        g = random.random()
        b = random.random()

        min_distance_to_previous = min(color_distance(new_color, prev_color) for new_color in ((r, g, b),) for prev_color in previous_colors)
        if min_distance_to_previous >= min_distance:
            return (r, g, b)

if __name__ == "__main__":
	label_to_xy = {
        "label_A": [[1, 2, 3, 4, 5, 5, 3, 2], [2, 1, 3, 5, 4, 3, 4, 3]],
        "label_B": [[10, 11, 12, 13, 14, 13, 12, 11], [15, 16, 13, 10, 14, 15, 13, 12]],
        "label_C": [[8, 7, 8, 7, 8, 9], [10, 8, 9, 9, 10, 8]]
    }
    draw_pic(label_to_xy)

欢迎关注本人,我是喜欢搞事的程序猿;一起进步,一起学习;

欢迎关注知乎/CSDN:SmallerFL

也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤

  • 12
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 我可以用Python来帮助你绘制Iris散点图矩阵。代码如下:import numpy as np import matplotlib.pyplot as plt# 读取iris.npz文件中的数据 data = np.load('iris.npz')# 绘制iris散点图矩阵 plt.scatter(data['x'], data['y'], c=data['c']) plt.xlabel('X') plt.ylabel('Y') plt.show() ### 回答2: 要读取iris.npz文件中的数据并绘制iris散点图矩阵,可以使用Python中的numpy和matplotlib库来完成。以下是一个简单的程序示例: ```python import numpy as np import matplotlib.pyplot as plt # 读取iris.npz文件中的数据 data = np.load('iris.npz') iris_features = data['features'] iris_labels = data['labels'] # 设置不同类别颜色标签 colors = ['r', 'g', 'b'] labels = ['Setosa', 'Versicolor', 'Virginica'] # 绘制散点图矩阵 fig, ax = plt.subplots(4, 4, figsize=(12, 12)) for i in range(4): for j in range(4): # 在散点图矩阵的每个子图中绘制相应的特征 if i == j: ax[i, j].hist(iris_features[:, i], color='gray', alpha=0.8) else: for k in range(3): ax[i, j].scatter(iris_features[iris_labels == k, j], iris_features[iris_labels == k, i], color=colors[k], label=labels[k]) # 设置子图的标题和坐标轴标签 if i == 0: ax[i, j].set_title('Feature {}'.format(j + 1)) if j == 0: ax[i, j].set_ylabel('Feature {}'.format(i + 1)) ax[i, j].legend() # 调整子图的间距和布局 plt.tight_layout() # 显示散点图矩阵 plt.show() ``` 在这个程序中,我们首先使用np.load函数读取iris.npz文件中的数据,其中`iris_features`表示样本特征,`iris_labels`表示样本标签。然后,我们设置了不同类别颜色标签,用于在散点图区分不同类别。接下来,我们使用matplotlib库的subplot函数创建一个4×4的子图矩阵,并使用循环在每个子图中绘制相应的特征。当x轴和y轴的特征不同时,我们使用scatter函数绘制散点图,并根据不同类别使用不同颜色标记。当x轴和y轴的特征相同时,我们使用hist函数绘制直方图表示该特征的布。最后,我们设置子图的标题、坐标轴标签和图例,并根据需要调整子图的间距和布局。最终,我们使用show函数显示散点图矩阵。 ### 回答3: 要读取iris.npz文件中的数据并绘制iris散点图矩阵,可以使用Python中的数据析和可视化库,如`numpy`、`pandas`和`matplotlib`。以下是一个编写该程序的示例: ```python import numpy as np import pandas as pd import matplotlib.pyplot as plt # 读取iris.npz文件 data = np.load('iris.npz') iris_data = data['arr_0'] iris_feature_names = data['arr_1'] # 将数据转换为DataFrame格式 df = pd.DataFrame(iris_data, columns=iris_feature_names) # 绘制散点图矩阵 pd.plotting.scatter_matrix(df, figsize=(10, 10)) plt.show() ``` 这个程序首先使用`np.load()`函数加载iris.npz文件,并将数据存储在`iris_data`变量中,将特征名称存储在`iris_feature_names`变量中。然后,使用`pd.DataFrame()`函数将数据转换为DataFrame格式,其中`columns`参数指定列的名称。最后,使用`pd.plotting.scatter_matrix()`函数绘制散点图矩阵,并使用`plt.show()`函数显示图形。 要运行这个程序,确保将iris.npz文件放在与程序文件相同的目录中,并将示例中的文件名替换为正确的文件名。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SmallerFL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值