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

news2024/11/28 8:29:54

文章目录

  • 1. 前言
  • 2. 实现
    • 2.1 构建数据对
    • 2.2 构建colors_map
    • 2.3 绘制图
  • 3. 完整示例


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公众号(精选高质量文章):一个比特定乾坤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1659283.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

可重入分布式锁有哪些应用场景

原文连接:可重入分布式锁有哪些应用场景 https://mp.weixin.qq.com/s/MTPS9V8jn5J91wr-UD4DyA 之前发过的一篇实现Redis分布式锁的8大坑中,有粉丝留言说,分布式锁的可重入特性在工作中有哪些应用场景,那么我们这篇文章就来看一下…

pythonsql-随机问答小程序

随机问答-python&sql 智力问答测试,在答题过程中对做对、做错进行实时跟踪,测试完成后能根据玩家的答题情况给出成绩。 1. 设计思路 程序使用了一个SQLite试题库test.db,其中每个智力问答山题目、4个选项*1-1正确答案组成(question, An…

Spring boot环境的常见问题

文章目录 一、启动类无法运行二、包相关问题2.1 默认配置的包无法下载2.2 第三方库的包无法下载2.3 包找不到 三、出现了一个无效的源发行版17四、类文件具有错误的版本 61.0,应为52.0五、控制台乱码 一、启动类无法运行 原因:IDEA 没有把当前项目识别成…

macos安装mysql一直卡在安装成功那个页面选项的解决办法

问题描述: 我安装的是比较新的版本8.0.37,安装过程中一直卡在安装那个选项上,且页面提示安装成功了,但就是死活不往下面的配置选项那一步走。 解决办法: 1.首先清理掉之前的mysql sudo rm -rf /usr/local/mysql2.然…

MATLAB模拟退火算法、遗传算法、蚁群算法、粒子群算法

概况 模拟退火算法、遗传算法、蚁群算法、粒子群算法等算法,都是属于概率算法,不绝对,不迅速,能用其它方式解决的问题,不要用这些相对复杂的算法,比如有明确的线性关系或者非线性对应关系。这里的概率算法…

二氧化碳在饮料汽水中的作用与西奥机电CLRT-01二氧化碳气容量测试仪的重要性

二氧化碳在饮料汽水中的作用与西奥机电CLRT-01二氧化碳气容量测试仪的重要性 一、引言 当我们打开一瓶冰镇的汽水,那独特的口感和清凉感总是让人心旷神怡。而这一切,都离不开其中溶解的二氧化碳。本文将详细解析二氧化碳在饮料汽水中的作用&#xff0c…

Jenkins docker 自动化部署python3后端 centos8.5 运维系列四

1安装expect yum install expect 2 jenkins 新建任务 #cat qysup.sh #!/usr/bin/expect -f set port 22 set user root set host ip set password 密码 set timeout 60 spawn ssh $user$host expect "password:" send "$password\r" expect "]#&qu…

Golang | Leetcode Golang题解之第73题矩阵置零

题目&#xff1a; 题解&#xff1a; func setZeroes(matrix [][]int) {n, m : len(matrix), len(matrix[0])col0 : falsefor _, r : range matrix {if r[0] 0 {col0 true}for j : 1; j < m; j {if r[j] 0 {r[0] 0matrix[0][j] 0}}}for i : n - 1; i > 0; i-- {for …

面试笔记——JVM组成

基本介绍 JVM: Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 使用JVM的好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM的组成及运行流程&#xff1a; 程序计数器 程序计数器&a…

用Rust打印杨辉三角

一、杨辉三角是什么&#xff1f; 杨辉三角是一个著名的数学图形&#xff0c;它展示了二项式系数的排列方式。 杨辉三角是一种将二项式系数以三角形阵列排列的数学图形&#xff0c;具有丰富的历史和数学意义。 杨辉三角的历史起源可以追溯到中国南宋时期&#xff0c;由数学家杨辉…

同创优配正规炒股A股三大指数集体收涨 创指重回1900点关口

查查配5月9日电 周四,A股三大指数震荡上扬。截至收盘,上证指数涨0.83%,报3154.32点;深证成指涨1.55%,报9788.07点;创业板指涨1.87%,报1900.01点。总体上个股涨多跌少,全市场超4200只个股上涨。沪深两市今日成交额9011亿元,较上个交易日放量367亿元。 同创优配是AAA 级诚信经营…

内存卡不小心格式化了怎么办?3个方法解决数据丢失问题!

“很奇怪&#xff0c;我的内存卡不小心中病毒了&#xff0c;刚刚在清理病毒时不小心把内存卡格式化了。我保存了很多重要的数据在里面&#xff0c;还有方法可以恢复这些数据吗&#xff1f;” 在数字设备日益普及的今天&#xff0c;内存卡已成为我们存储和传输数据的重要工具。但…

竖排文字识别原理与实践操作方法

在当今数字化时代&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术已经广泛应用于各个领域&#xff0c;特别是在文档处理方面&#xff0c;OCR软件能够帮助用户快速将纸质文档转化为可编辑的电子文档。然而&#xff0c;对于竖…

OpenSearch 与 Elasticsearch:7 个主要差异及如何选择

OpenSearch 与 Elasticsearch&#xff1a;7 个主要差异及如何选择 1. 什么是 Elasticsearch&#xff1f; Elasticsearch 是一个基于 Apache Lucene 构建的开源、RESTful、分布式搜索和分析引擎。它旨在处理大量数据&#xff0c;使其成为日志和事件数据管理的流行选择。 Elasti…

顺序表的实现(迈入数据结构的大门)(2)

目录 顺序表的头插(SLPushFront) 此时&#xff1a;我们有两个思路&#xff08;数组移位&#xff09; 顺序表的头删(学会思维的变换)(SLPopFront) 顺序表的尾插(SLPushBack) 有尾插就有尾删 既然头与尾部的插入与删除都有&#xff0c;那必然少不了指定位置的插入删除 查找…

Python嵌套绘图并为条形图添加自定义标注

论文绘图时经常需要多图嵌套&#xff0c;正好最近绘图用到了&#xff0c;记录一下使用Python实现多图嵌套的过程。 首先&#xff0c;实现 Seaborn 分别绘制折线图和柱状图。 绘制折线图import seaborn as snsimport matplotlib.pyplot as pltimport warningswarnings.filterw…

【日常开发之插件篇】IDEA plugins 神器助我!!

文章目录 Tabnine 代码自动补全图例 Rainbow Brackets图例 Translation 翻译配置 LombokAlibaba Java Coding Guidelines 阿里巴巴的编码规约检查插件 今早因为老代码的一些bug让我突然觉得Idea的一些插件特别好用&#xff0c;我准备将我平时所用到的一些插件做个推荐以及记录。…

全国智能网联汽车行业产教融合共同体成立, 经纬恒润当选常务理事单位

近日&#xff0c;全国智能网联汽车行业产教融合共同体&#xff08;以下简称“共同体”&#xff09;全体成员大会在湖南株洲隆重召开。湖南省教育厅职成处副处长殷劭&#xff0c;国家智能网联汽车创新中心常务副主任、国汽&#xff08;北京&#xff09;智能网联汽车研究院有限公…

可以录屏的软件推荐3款,让你的录制更高效!

在信息时代&#xff0c;数字化学习、远程办公等场景越来越普及&#xff0c;录屏软件已经成为了人们生活中不可或缺的一部分。一款好的录屏软件可以帮助用户轻松录制屏幕内容&#xff0c;以便随时回顾或与他人分享。本文将详细介绍三款可以录屏的软件&#xff0c;帮助读者了解它…

百度百科怎么创建自己

百度百科是一个向所有互联网用户开放的平台&#xff0c;人人都可以创建词条。以下是创建自己百度百科的步骤和注意事项。 创建步骤 注册百度账号&#xff1a;首先&#xff0c;你需要注册一个百度账号。如果已经有百度账号&#xff0c;可以直接登录。 选择百科类型&#xff1a;…