【Python小demo】JOJO替身面板生成

news2024/11/28 0:32:59

文章目录

  • 1 前言
  • 2 代码实现
  • 3 总结

1 前言

最近暑假在数模研赛备赛,情理之中地接触了一些图表。也是第一次才知道雷达图这么个图表形式,用于直观地评价多个变量或指标。看到雷达图,我不禁联想到了JOJO中的替身面板,于是兴起想用Python的matplotlib库绘制一下。
在这里插入图片描述

2 代码实现

直接上代码,对matplotlib库了解得不太深入,因此写得有点冗余。
下面是直接从备赛代码中拿出的雷达图绘制类:

# 雷达图绘制类
class RadarChart:
    def __init__(self, radar_data, label, category = None):
        self.data = radar_data
        self.label = label
        self.category = category
        self.initial()

    def initial(self):
        colors = list(mcolors.TABLEAU_COLORS.keys())  # 颜色变化
        self.fig = plt.figure(figsize = (5, 5), dpi = 100)  # 建立画布
        self.ax = self.fig.add_subplot(111, polar = True)  # 增加子网格,注意polar参数,极坐标
        angles = np.linspace(0, 2 * np.pi, len(self.label), endpoint = False)  # 计算各个区间的角度
        self.angles = np.concatenate((angles, [angles[0]]))  # 建立相同首尾字段以便于闭合
        self.datas = np.concatenate((self.data, self.data[:, 0].reshape(-1, 1)), axis = 1)  # 建立相同首尾字段以便于闭合
        for i in range(len(self.datas)):
            self.line, = self.ax.plot(self.angles, list(self.datas[i]), 'o-', c = 'deeppink', markersize = 3,
                                      linewidth = 3,
                                      label = self.category[i])  # 画线
            self.fill, = self.ax.fill(self.angles, list(self.datas[i]), alpha = 0.5, c = 'hotpink')
        # 设置图像显示格式
        self.ax.set_thetagrids(angles * 180 / np.pi, self.label)  # 设置极坐标轴
        # self.ax.set_title(self.category[0])  # 设置标题放置
        self.ax.set_rlim(0, np.max(self.data))  # 设置坐标轴尺度范围
        plt.legend(loc = "upper right", bbox_to_anchor = (1.2, 1.0))  # 设置图例位置

    def draw(self, save = False):
        if save:
            plt.savefig(u'radar_chart.png')
        plt.show()

    def export_data(self, fn = 'radar_data.csv'):
        pd.DataFrame(self.data, index = list(range(4)), columns = list(self.label)).to_csv(fn, index = False,encoding = 'utf-8-sig')

派生一个用于绘制JOJO替身面板的子类。

class JOJOPanel(RadarChart):
    def __init__(self, _character, _panel):
        self.character = _character
        self.panel = _panel
        self.value_map = ['F', 'E', 'D', 'C', 'B', 'A']
        _data = np.array(list(map(lambda x: self.value_map.index(x), self.panel.values()))).reshape(1, -1)
        _labels = list(self.panel.keys())
        super().__init__(_data, _labels, self.character)
        self.ax.patch.set_facecolor('gold')
        self.ax.patch.set_alpha(0.5)
        self.ax.grid(True)  # 是否显示网格
        self.ax.set_theta_zero_location('SE')  # 0°可设置在八个位置,分别为N, NW, W, SW, S, SE, E, NE
        self.ax.set_rlabel_position(180)  # 设置极径标签显示位置(角度)
        # self.ax.set_rticks(np.arange(0, 0))  # 设置极径网格线的显示范围
        self.ax.set_rlim(0, 6)  # 设置显示的极径范围
        # self.ax.set_rgrids([0, 1, 2, 3, 4, 5])  # 设置极径网格线显示,参数为所要显示网格线的极径值列表
        self.ax.get_legend().remove()  # 删除图例

这样就写完了!我们看看效果如何,尝试绘制一下黄金体验的替身面板。

character = ["Gold Experience"]
panel = {"破坏力": 'C',
         "成长性": 'A',
         "精密动作性": 'C',
         "速度": 'A',
         "射程": 'C',
         "持续性": 'D'}
jp = JOJOPanel(character, panel)
jp.draw()

运行效果如下:

为了还原剧中的动态绘制效果,我们直接from matplotlib.animation import FuncAnimation,进行动态绘制。我们继续在JOJOPanel类中添加一个draw_dynamic函数。

def draw_dynamic(self, frame: int = None, method = 'accel'):
     if frame is None:
         frame = len(self.value_map)

     # 运动方程
     def motion(t):
         s = 0
         if method == 'accel':  # 加速度变化,匀减速
             S = 1
             v0 = (2 * S) / frame
             a = -v0 / frame
             s = v0 * t + 0.5 * a * t * t
         else:  # 线性变化
             v = 1 / frame
             s = v * t
         return s

     def init():
         y = self.datas * 0
         self.line.set_data(self.angles, y)  # 设置初始 x,y
         self.fill.set_xy(np.concatenate((self.angles.reshape(-1, 1), y.reshape(-1, 1)), axis = 1))
         return self.line

     def update(step):
         cur_t = step + 1
         y = self.datas * motion(cur_t)
         self.line.set_data(self.angles, y)  # 设置新的 x,y
         self.fill.set_xy(np.concatenate((self.angles.reshape(-1, 1), y.reshape(-1, 1)), axis = 1))
         return self.line

     ani = FuncAnimation(self.fig, update, frames = frame, interval = 1, blit = False,
                         repeat = False, init_func = init)  # 创建动画效果
     plt.show()  # 显示图片

上面的动画是一个线性变化的过程,看起来没有剧中的那么自然,有点生硬。于是我加了一个匀减速运动方程,效果如下:

左边是线性变化,右边是匀减速变化。

3 总结

最终效果只是部分还原,就这样啦~

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

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

相关文章

.NET 应用程序 部署

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 本文内容 在设备上部署 dotnet应用,与任何其他平台的部署相同,可以2种方式: 依赖于框…

Zebec Protocol ,不止于 Web3 世界的 “Paypal”

Paypal 是传统支付领域的巨头企业,在北美支付市场占有率约为 77% 以上。从具体的业务数据看,在8月初,Paypal 公布的 2023 年第二季度财报显示,PayPal 第二季度净营收为 73 亿美元,净利润为 10.29 亿美元。虽然 Paypal …

【C# 基础精讲】运算符和表达式

在C#编程中,运算符和表达式是构建复杂逻辑的关键元素。运算符用于执行各种数学、逻辑和其他操作,而表达式则由运算符、变量、常量和函数组成,用于生成计算结果。本文将详细介绍C#中常见的运算符和表达式的概念,以及它们在程序中的…

全面讲解最小二乘法

常见的最小二乘法我们就不多说了,下面主要介绍一下最小二乘法的一些先进方法。 正则化的最小二乘法 在使用常见的最小二乘法进行回归分析时,常常会遇到过拟合的问题,也就是在训练数据集上表现的很好,但是在测试数据集上表现的很…

Flutter 让软键盘不再自动弹起

1、问题说明: 在开发中,经常遇到这种事,一个页面有输入框,点击输入框后,会弹起软键盘,同时输入框会聚焦,手动收起软键盘后,点击另一个按钮前往下一个页面或者显示一个弹窗&#xff0…

heima头条项目学习--Day1: 环境搭建、SpringCloud微服务(注册发现、网关)

Nacos注册发现、网关 a. 项目介绍b. app登录1) 需求分析2) 表结构分析3) 手动加密(md5随机字符串)4) 用户端微服务搭建5) 功能实现6) app网关7) 网关校验jwt8) 前端集成, 配置nginx a. 项目介绍 业务说明 技术栈说明 [外链图片转存失败,源站可能有防盗…

Nginx的优化和防盗链(面试高频!!!)

Nginx的优化和防盗链 全篇高能!!!!干货较多!!!!本篇含面试高频题: 修改配置文件时,先备份!!!以便回滚!&…

API接口:企业信息核验

企业信息核验是现代企业管理中必不可少的一项业务,它可以帮助企业做出正确的决策。在这篇文章里,我们将会介绍如何使用API接口来对企业信息进行核验,并实现快捷、准确的查询。 一、API接口 在这里我们使用的是挖数据提供的企业信息核验API接…

医学影像PACS临床信息系统源码

医学影像临床信息系统(Picture Archiving and Communication Systems)PACS是指从医疗影像设备中获得数字影像,利用高速网络进行存储、管理、传输的医疗影像信息管理系统。通过该系统,能实现影像数字化、无胶片化管理。 登记系统 …

MyCat水平分表

1.水平拆分案例场景 2.MyCat配置 这个表只是在 schema.xml配置的逻辑表,在具体的数据库里面是没有的 根据id的模确定数据存在哪个节点上!!

8.7 作业 c高级

1.写一个函数,获取用户的uid和gid并使用变量接收: #!/bin/bash function fun() {uidid -u ubuntugidid -g ubuntu }funecho "UID: $uid" echo "GID: $gid"思维导图:

(树) 剑指 Offer 54. 二叉搜索树的第k大节点 ——【Leetcode每日一题】

❓剑指 Offer 54. 二叉搜索树的第k大节点 难度:简单 给定一棵二叉搜索树,请找出其中第 k 大的节点的值。 示例 1: 输入: root [3,1,4,null,2], k 13/ \1 4\2 输出: 4示例 2: 输入: root [5,3,6,2,4,null,null,1], k 35/ \3 6/ \2 4/1 输出…

【多音音频测试信号】具有指定采样率和样本数的多音信号,生成多音信号的相位降低波峰因数研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Jmeter响应中的乱码问题

文章目录 问题描述解决办法 问题描述 Jmeter在访问接口的时候,响应内容如果有中文可能会显示乱码 响应页面没有做编码处理,JMeter默认按照ISO-8859-1编码格式进行解析 解决办法 在线程组中添加BeanShell PostProcessor后置处理器 prev.setDataEnco…

爬虫009_字符串高级_替换_去空格_分割_取长度_统计字符_间隔插入---python工作笔记028

然后再来看字符串的高级操作 取长度 查找字符串下标位置 判断是否以某个字符,开头结尾 计算字符出现次数 替换

STM32调试过程中的使用技巧及解决办法

文章目录 技巧 1.定时器使用过程中,分频系数越大,定时误差越大,越不准确。问题 2.编译时出现下述警告:解决办法: keil5 编译提示 single-precision operand implicity converted to double-precesion,意思是…

生成小程序二维码、小程序码

微信自定义生成二维码 使用微信云开发生成自定义二维码、小程序码话不多说,我们先来看最终的展示效果生成码有三种方式操作步骤1. 云环境的初始化2. 在页面上开辟一个容器来展示二维码(包括预览和保存到相册的按钮)3. 创建云函数4. 生成二维码…

黑客真的那么神奇吗?

对于这个话题我觉得我还是有发言权的,因为本人2008年从事这个行业至今已经是第八个年头。怎么进入这个行业的呢。说起来可笑因为当时家里并没有安装有线电视,而当时我才上初中有碰巧是奥运期间本人是个狂热体育迷所以只能去网吧看直播。兜里又没有几块钱…

按轨迹运行(纯跟踪)

文章目录 import numpy as np import math import matplotlib.pyplot as pltk = 0.1 # 前视距离系数 Lfc = 2.0 # 前视距离 Kp = 1.0 # 速度P控制器系数 dt = 0.1 # 时间间隔,单位:s L = 2.9 # 车辆轴距,单位:mdef plot_arrow(x, y, yaw, length=5, width=1):dx = len…

研发工程师玩转Kubernetes——hostPath

有别于《研发工程师玩转Kubernetes——emptyDir》一文中介绍的emptyDir,hostPath可以在同一个Node的不同Pod间共享卷。 下面的清单文件利用了Pod亲和性,让Pod集中到一个Node上。 apiVersion: apps/v1 kind: Deployment metadata:name: hostpath-deploy…