全网最全的平行坐标图(parallel coordinates plot)的绘制攻略

早上起来拥抱太阳,写小论文,看到人家的图怎么那么好看!!??
在这里插入图片描述
这不得赶紧抄下来,我也发一个顶刊?于是开始思考如何解决绘制这个问题,目前现有的大部分解决方案都是直接调库,查了一下现有的所有解决方案,

1.直接python调库

这篇文章直接调库,但是没有分类,而且也感觉不太好看
在这里插入图片描述

https://www.zhihu.com/question/571887313

这一个是调pandas库的,虽然有分类但是他的轴不能归一化调整。
在这里插入图片描述

https://www.cnblogs.com/caiyishuai/p/12322671.html

2.matlab

matlab作为强大的科研工具是众所周知的,他也提供了一个库来专门绘制平行坐标图。但是由于电脑内存不够,我就直接用线上matlab。经过学习之后,绘制出来这样的图,emmm老实说有点丑,但是指不定有人需要这个呢?
在这里插入图片描述

tbl = readtable('tt.csv');
head(tbl);
tbl.Name = categorical(tbl.Name);
p = parallelplot(tbl);
p.GroupVariable = 'Name';
p.CoordinateVariables = [3 2 4];
p.LineWidth = 1.5;
p.FontSize = 25;
p.Color = {'#B4FF00','#00E68C','#1432FA','#B4C8FA','#FF3232'}
%p.Color = {'#780001','#C11221','#FEF0D5','#002F49','#669BBB'}

其中csv的格式大概是这样的

cost time energy Name
0 2 20 GMPSO
0 8 90 KAMSA
6 5 30 COSA

太丑了还是下一个

3.用Origin绘制

Origin不愧是专业的绘图工具,绘制出来的图确实还不错。这里也是因为电脑内存原因所以我就没试着用Origin了。贴个参考文献:

https://cloud.tencent.com/developer/article/1623006?areaSource=102001.5&traceId=e-JyHo2xQfKU1fPJYmtbA

在这里插入图片描述

4.用高手做的轮子

上面尽管提供了三种方案,但是感觉也不能绘制出我想要的图形。于是乎我就上github寻找,肯定有大神。这个大神是我目前找到最满意的解决方案了。

https://github.com/jraine/parallel-coordinates-plot-dataframe

这个仓库提供了一个不错的解决方案,他能绘制出好看的平行坐标图,而且也不用引太多的库。

在这里插入图片描述
照着这个代码魔改了一下,我就绘制出来这样的图形了
在这里插入图片描述
这不比上面的图要好看?我就是天才啊哈哈哈,现在先问问老师我最后一格要不要换成图例,不用的话论文就贴这个图了。下面是魔改后的代码:

import matplotlib
from matplotlib import ticker
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from scipy.interpolate import make_interp_spline


def read_and_add_method(file_path, method_name):
    df = pd.read_csv(file_path)
    if method_name == 'ChaoticOSA':
        method_name = 'COSA'
    if method_name == 'WDNMN':
        method_name = 'WDNS'
    df['method'] = method_name  # 添加新列记录算法名
    return df

def parallel_plot(df,cols,rank_attr,cmap='Spectral',spread=False,curved=0.1,curvedextend=0.05):
    '''Produce a parallel coordinates plot from pandas dataframe with line colour with respect to a column.
    Required Arguments:
        df: dataframe
        cols: columns to use for axes
        rank_attr: attribute to use for ranking
    Options:
        cmap: Colour palette to use for ranking of lines
        spread: Spread to use to separate lines at categorical values
        curved: Spline interpolation along lines
        curvedextend: Fraction extension in y axis, adjust to contain curvature
    Returns:
        x coordinates for axes, y coordinates of all lines'''
    colmap = matplotlib.cm.get_cmap(cmap)
    cols = cols + [rank_attr]

    fig, axes = plt.subplots(1, len(cols)-1, sharey=False, figsize=(3*len(cols)+3,5))#绘制三个子图
    valmat = np.ndarray(shape=(len(cols),len(df)))#定义需要绘制曲线的数组有df行,cols列
    x = np.arange(0,len(cols),1)#貌似没什么用,有3列那么x=[0,1,2]
    ax_info = {}
    for i,col in enumerate(cols):#归一化数据
        vals = df[col]
        if (vals.dtype == float) & (len(np.unique(vals)) > 20):
            minval = np.min(vals)
            maxval = np.max(vals)
            rangeval = maxval - minval#区间长度
            vals = np.true_divide(vals - minval, maxval-minval)#归一化处理vals-minval/maxval-minval除法运算
            nticks = 5
            tick_labels = [round(minval + i*(rangeval/nticks),4) for i in range(nticks+1)]
            ticks = [0 + i*(1.0/nticks) for i in range(nticks+1)]
            valmat[i] = vals
            ax_info[col] = [tick_labels,ticks]
        else:
            vals = vals.astype('category')#假如是目录型
            cats = vals.cat.categories
            c_vals = vals.cat.codes
            minval = 0
            maxval = len(cats)-1
            if maxval == 0:
                c_vals = 0.5
            else:
                c_vals = np.true_divide(c_vals - minval, maxval-minval)
            tick_labels = cats
            ticks = np.unique(c_vals)
            ax_info[col] = [tick_labels,ticks]
            if spread is not None:
                offset = np.arange(-1,1,2./(len(c_vals)))*2e-2
                np.random.shuffle(offset)
                c_vals = c_vals + offset
            valmat[i] = c_vals
            
    extendfrac = curvedextend if curved else 0.05  
    for i,ax in enumerate(axes):
        for idx in range(valmat.shape[-1]):
            if curved:
                x_new = np.linspace(0, len(x), len(x)*20)
                a_BSpline = make_interp_spline(x, valmat[:,idx],k=3,bc_type='clamped')
                y_new = a_BSpline(x_new)
                ax.plot(x_new,y_new,color=colmap(valmat[-1,idx]),alpha=0.5)
            else:
                ax.plot(x,valmat[:,idx],color=colmap(valmat[-1,idx]),alpha=0.5)
        ax.set_ylim(0-extendfrac,1+extendfrac)
        ax.set_xlim(i,i+1)
    
    for dim, (ax,col) in enumerate(zip(axes,cols)):
        ax.xaxis.set_major_locator(ticker.FixedLocator([dim]))
        ax.yaxis.set_major_locator(ticker.FixedLocator(ax_info[col][1]))
        ax_info[col][0] = [int(label) for label in ax_info[col][0]]#y标签下取整
        ax.set_yticklabels(ax_info[col][0])
        ax.set_xticklabels([cols[dim]])
    
    
    plt.subplots_adjust(wspace=0)
    norm = matplotlib.colors.Normalize(0,1)#*axes[-1].get_ylim())
    sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
    cbar = plt.colorbar(sm,pad=0,ticks=ax_info[rank_attr][1],extend='both',extendrect=True,extendfrac=extendfrac)
    #if curved:
        #cbar.ax.set_ylim(0-curvedextend,1+curvedextend)
    cbar.ax.set_yticklabels(ax_info[rank_attr][0])
    cbar.ax.set_xlabel(rank_attr)
    plt.show()
            
    return x,valmat

method_names = ['GALCS','GMPSO',"ChaoticOSA","KAMSA","WDNMN"]
data_size = 30
data_index = 50
data_set_name = 'CyberShake'

# 存储所有DataFrame的列表
all_dataframes = []

# 遍历目录下所有的CSV文件
for method_name in method_names:
    fileName = 'D://demo//dataset/5.0-5.0/'+str(data_size)+'/'+str(data_size)+data_set_name+str(data_index)+method_name+'_0.csv'
    df = read_and_add_method(fileName, method_name)
    # 将DataFrame添加到列表中
    all_dataframes.append(df)

# 将所有的DataFrame拼接在一起
final_dataframe = pd.concat(all_dataframes, ignore_index=True)
print(final_dataframe)

parallel_plot(final_dataframe,['time','cost','energy'],'method')
# 定义函数,读取CSV文件并添加一个新列'method'

解决了一个问题咯,拜拜咯

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【计算机毕业设计】理发店管理系统产品功能说明——后附源码

🎉**欢迎来到我的技术世界!**🎉 📘 博主小档案: 一名来自世界500强的资深程序媛,毕业于国内知名985高校。 🔧 技术专长: 在深度学习任务中展现出卓越的能力,包括但不限于…

Python Selenium无法打开Chrome浏览器处理自定义浏览器路径

问题 在使用Python Selenium控制Chrome浏览器操作的过程中,由于安装的Chrome浏览器的版本找不到对应版本的驱动chromedriver.exe文件,下载了小几个版本号的驱动软件。发现运行下面的代码是无法正常使用的: from selenium import webdriver …

HWOD:合并整型数组

一、知识点 合并整型数组目前有两种方法 合并数组并不一定需要真正的合并 1、下意识的方法 对两个整型数组分别排序,然后合并 2、不排序的方法 遍历两个数组,找出最小值,输出最小值。将两个数组中与最小值相等的位置置为超大值 重复以…

二叉树oj题(2)

1.二叉树的最近公共祖先 解题思路:方法一: 1.先判断p或者q 是不是 root当中的一个 2.左子树当中递归査找p或者q 3.右子树当中递归查找p或者q 如何查找: root 的 left 和 right 都不为空 ->root root的 left 为空 right 不为空->right这一侧找…

终于有人说明白了session、cookie和token的区别

一、首先介绍一下名词:Session、cookie、token,如下: 1.Session会话:客户端A访问服务器,服务器存储A的数据value,把key返回给客户端A,客户端A下次带着key(session ID)来…

ROS轻松入门(一)—— 基本概念:node节点、topic通信、service通信

node节点 ROS 中的每个节点都应该负责单一的、模块化的目的,例如控制车轮马达或发布来自激光测距仪的传感器数据。每个节点都可以通过主题、服务、操作或参数从其他节点发送和接收数据。 一个完整的机器人系统由许多协同工作的节点组成。在 ROS 2 中,单…

【java配置】jpcap的下载与idea配置

解决报错:Cannot resolve symbol ‘jpcap’ 1. jpcap的下载 官网下载链接 百度网盘下载 双击WinpPca安装,jacap1和jpcap2任选其中之一 2. idea配置 (1)查看当前使用jdk目录 File -> Project Settings -> SDKs &#…

STM32H750时钟频率和功耗以及RTC功能测试

STM32H750时钟频率和功耗和RTC功能测试 📌相关篇《STM32H750片外QSPI启动配置简要》 ✨在使用STM32CubeMX修改STM32H750时钟树参数时,如果使用软件自动求解,这是一个非常耗时的操作,有时候还不一定成功,还是推荐使用手…

2024成都直播电商硝烟再起,天府锋巢AI 时代拉开帷幕

在今年1月份的“AI重构电商”生态大会上,百度借力AI数字人直播和文心大模型能力杀入电商场内,强调“AI重塑电商”。成都兴隆湖畔,天府锋巢直播产业基地计划开展高质量、低成本、互动性更强的虚拟数字人直播,为直播行业注入新的活力…

低代码技术与仓储管理的新纪元:革命性的供应链变革

引言 在当今数字化时代,企业对于创新和效率的追求越发迫切。在这样的背景下,低代码技术应运而生,成为企业数字化转型的重要工具之一。低代码技术的崛起为企业提供了一种快速、灵活、成本效益高的开发方式,大大缩短了软件开发周期…

2024五一劳动节市集露营生活节活动策划方案

2024五一劳动节市集露营生活节(向野而生 躺平生活节主题)活动策划方案 方案页码:72页 文件格式:pptx 方案简介: 五一躺平生活节 咖啡一饮,书本一翻,轻松又自在,看着窗外的阳光,…

4.23日总结(项目总结)

1.项目: 今日项目通过一个在登录界面的一个静态变量,完成了区分老师和学生,能够分开老师和学生,并且不同身份的人进去会有不同的显示,以及登录链接主界面,还有学生和老师的不同的表,其次就是创…

「51媒体」新闻媒体邀约如何进行媒体宣传(方法)

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 新闻媒体邀约进行媒体宣传是一个策略性的过程,旨在吸引媒体的注意力并促使其对特定事件、产品发布或企业活动进行报道。以下是一些关键步骤和策略: 制定媒体传播方…

rust 学习笔记(13-19)

13 迭代器与闭包 Rust 的设计灵感来源于很多现存的语言和技术。其中一个显著的影响就是 函数式编程(functional programming)。函数式编程风格通常包含将函数作为参数值或其他函数的返回值、将函数赋值给变量以供之后执行等等。 闭包(Closu…

网络爬虫快速入门及爬取百度搜索结果(附源码)

前言 爬虫的基本结构及工作流程 1. 确定目标 首先,确定你想要爬取的目标,包括目标网站或网页、需要提取的数据类型(如文本、图片、视频等)以及爬取的深度(单页、整个网站等)。 2. 获取网页内容 使用HT…

刷题之Leetcode242题(超级详细)

242.有效的字母异位词 力扣题目链接(opens new window)https://leetcode.cn/problems/valid-anagram/ 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s "anagram", t "nagaram" 输出: true 示例 2…

基于51单片机的数码管显示的proteus仿真

文章目录 一、数码管二、单个数码管显示0~F仿真图仿真程序 三、数码管静态显示74HC138译码器74HC245缓冲器仿真图仿真程序 四、数码管动态显示仿真图仿真程序 三、总结 一、数码管 数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。它的基…

Abaqus2024 安装教程(附免费安装包资源)

鼠标右击软件压缩包,选择“解压到Abaqus2024”。 鼠标右击“此电脑”,选择“属性”。 点击“高级系统设置”。 点击“环境变量”。 点击“新建”。 变量名输入:NOLICENSECHECK 变量值输入:true 然后点击“确定”。 点击“确定”。…

SD-WAN多分支组网案例分享

随着企业规模持续扩大,业务版图日益多元,多分支组网已成为企业网络建设的核心议题。如何构建高效、安全且灵活的网络连接,成为企业急需解决的关键问题。近些年,SD-WAN技术的崭露头角,为企业带来了前所未有的解决方案。…

芯片数字后端设计入门书单推荐(可下载)

数字后端设计,作为数字集成电路设计的关键环节,承担着将逻辑设计转化为物理实现的重任。它不仅要求设计师具备深厚的电路理论知识,还需要对EDA工具有深入的理解和熟练的操作技能。尽管数字后端工作不像前端设计那样频繁涉及代码编写&#xff…