【原创】用Matplotlib绘制的图表,真的是太惊艳了!!

news2024/11/26 8:19:51

当我们谈论Python中的数据可视化,Matplotlib是一个不可或缺的库。它强大的功能和灵活性使我们能够以各种方式轻松地呈现数据。然而,有时候,我们可能会忽视Matplotlib在创建视觉上令人惊叹的图像方面的潜力。在本文中,我们将探讨如何使用Matplotlib绘制出吸引人的、有趣的和美观的图像。

圆环图中间带有文字

我们可以在双层圆环图当中放置文字来代表关键的信息,例如我们整体的业绩指标,通过该图可以来显示目前已经达到的进度,代码如下

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

actual_value = 45
target_value = 120
remaining_value = target_value - actual_value

colours = ['#3da9d4', '#063b63']

fig = plt.figure(figsize=(10,10), facecolor='#25253c')
ax = fig.add_subplot(1,1,1)

pie = ax.pie([55, 45], 
        colors=colours, 
        startangle=90, 
        labeldistance=1.15, 
        counterclock=False)

pie[0][1].set_alpha(0.4)

# 添加内圆环
centre_circle = plt.Circle((0, 0), 0.6, fc='#25253c')

# Adding the circles to the chart
fig.gca().add_artist(centre_circle)

# 添加文字
centre_text = f'${actual_value}K'
centre_text_line_2 = f'Total Revenue'

ax.text(0,0.1, centre_text, horizontalalignment='center', 
            verticalalignment='center', 
            fontsize=44, fontweight='bold',
            color='white')
ax.text(0,-0.1, centre_text_line_2, horizontalalignment='center', 
            verticalalignment='center', 
            fontsize=20, fontweight='bold',
            color='grey')

plt.show()

output

2d9fbf8fcc25b162fb80a9c141b3cfcd.png

从上面出来的结果中我们可以看到整个圆环代表的是整体的目标,也就是45K的整体业绩指标,可以看到直观的看到目前所处的进度,即55%,以及还未完成的部分,即45%。圆环中间我们也可以添加文字,来更加直观对整个图表做一个说明

甘特图

甘特图基本上是应用在项目管理当中,提供关于项目进度的相关内容,包括了

  • 哪些项目是已经完成了的

  • 哪些项目还未完成,当下的进度是如何

  • 项目原定计划的周期

  • 等等

当然除了Matplotlib之外还有其他的模块也能够来绘制甘特图,小编之前也写了一篇相关的教程

【原创】用Python来绘制甘特图并制作可视化大屏,太方便了!!

而用Matplotlib模块绘制甘特图的详细的代码如下

import datetime
import matplotlib.pyplot as plt
from matplotlib.dates import datestr2num, DateFormatter, DayLocator
from matplotlib.ticker import AutoMinorLocator
from matplotlib.patches import Patch

# 创建假数据
tasks = ['Task A', 'Task B', 'Task C', 'Task D', 'Task E', 'Task F', 'Task G', 'Task H', 'Task I', 'Task J']
start_dates = ['2023-02-25', '2023-03-10', '2023-03-13', '2023-03-23', '2023-04-01', '2023-04-05', '2023-04-12', '2023-04-20', '2023-04-24', '2023-05-02']
end_dates = ['2023-03-03', '2023-03-17', '2023-03-22', '2023-03-30', '2023-04-07', '2023-04-18', '2023-04-23', '2023-04-25', '2023-05-03', '2023-05-07']

# 创建项目的开始与结束时间
start_dates = [datestr2num(d) for d in start_dates]
end_dates = [datestr2num(d) for d in end_dates]

durations = [(end - start) for start, end in zip(start_dates, end_dates)]

fig, ax = plt.subplots(figsize=(15, 8), facecolor='#25253c')

ax.set_facecolor('#25253c')

# 根据类目的不同来设定不同的颜色
colors = ['#7a5195', '#ef5675', '#ffa600'] 
task_colors = [colors[0]] * 3 + [colors[1]] * 4 + [colors[2]] * 3

# 展示柱状图
ax.barh(y=tasks, width=durations, left=start_dates, 
height=0.8, color=task_colors)

ax.invert_yaxis()

# X轴的坐标
ax.set_xlim(start_dates[0], end_dates[-1])

date_form = DateFormatter("%Y-%m-%d")
ax.xaxis.set_major_formatter(date_form)

ax.xaxis.set_major_locator(DayLocator(interval=10))
ax.xaxis.set_minor_locator(AutoMinorLocator(5))
ax.tick_params(axis='x', which='minor', length=2, color='white', labelsize=6)

ax.get_yaxis().set_visible(False)


ax.grid(True, axis='x', linestyle='-', color='#FFFFFF', alpha=0.2, which='major')
ax.grid(True, axis='x', linestyle='-', color='#FFFFFF', alpha=0.05, which='minor')
ax.set_axisbelow(True)

# 给每一个任务添加注释
for i, task in enumerate(tasks):
    ax.text(start_dates[i], i, f'  {task}', ha='left', va='center', color='white', fontsize=12, fontweight='bold')

# 添加时间轴
today = datetime.datetime.now().strftime("%Y-%m-%d")
today_num = datestr2num(today)
ax.axvline(today_num, color='red', alpha=0.8)

# X轴的注释和标题设置
ax.tick_params(axis='both', colors='white')

ax.set_xlabel('Date', color='white', fontsize=12)
ax.set_title('Project Schedule', color='white', fontsize=14)

# 横轴和纵轴隐藏
ax.spines['left'].set_visible(False)
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)

# 分类标注出来
legend_elements = [
    Patch(facecolor=colors[0], label='Planning'),
    Patch(facecolor=colors[1], label='Development'),
    Patch(facecolor=colors[2], label='Testing'),
]

# 添加注释
ax.legend(handles=legend_elements, loc='upper right', 
          facecolor='white', 
          edgecolor='white', 
          fontsize=10, title='Phases', title_fontsize=12, frameon=True)

plt.show()

output

231d6bbb405b0ea8d0b573802e47e6ed.png

从结果中我们可以看到每条任务的开始与结束的时间,以及所处的不同的状态,有计划中的任务、开发中的任务以及测试中的任务等等,基于当下的时间我们正处于哪项任务。

环状条形图

最后介绍一下环状条形图,整体效果会更加的惊艳,但是可读性和前面二者相比可能会稍差一些,代码如下

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

# 创建假数据
lith_dict = {'LITH': ['Shale', 'Sandstone', 
                      'Sandstone/Shale', 'Chalk', 
                      'Limestone', 'Marl', 'Tuff'],
             'PERCENTAGE': [40,65, 40, 35, 
                            40, 70, 50]}
# 变成DataFrame格式
df = pd.DataFrame.from_dict(lith_dict)

max_value_full_ring = max(df['PERCENTAGE'])

ring_colours = ['#003f5c', '#374c80', '#7a5195','#bc5090',
               '#ef5675','#ff764a','#ffa600']

ring_labels =  [f'{x} ({v})' for x, v in zip(list(df['LITH']), 
                                                 list(df['PERCENTAGE']))]
data_len = len(df)
# 创建一个画布出来
fig = plt.figure(figsize=(10,10), facecolor='#393d5c')

rect = [0.1,0.1,0.8,0.8]

ax_cart = fig.add_axes(rect, facecolor='#25253c')
ax_cart.spines[['right', 'top', 'left', 'bottom']].set_visible(False)
ax_cart.tick_params(axis='both', left=False, bottom=False, 
                   labelbottom=False, labelleft=False)

ax_polar_bg = fig.add_axes(rect, polar=True, frameon=False)
ax_polar_bg.set_theta_zero_location('N')
ax_polar_bg.set_theta_direction(1)

for i in range(data_len):
    ax_polar_bg.barh(i, max_value_full_ring*1.5*np.pi/max_value_full_ring, 
                     color='grey', 
                     alpha=0.1)
# 隐藏掉所有的横轴纵轴
ax_polar_bg.axis('off')
    
ax_polar = fig.add_axes(rect, polar=True, frameon=False)
ax_polar.set_theta_zero_location('N')
ax_polar.set_theta_direction(1)
ax_polar.set_rgrids([0, 1, 2, 3, 4, 5, 6], 
                    labels=ring_labels, 
                    angle=0, 
                    fontsize=14, fontweight='bold',
                    color='white', verticalalignment='center')

# 遍历所有的数据,然后绘制柱状图
for i in range(data_len):
    ax_polar.barh(i, list(df['PERCENTAGE'])[i]*1.5*np.pi/max_value_full_ring, 
                  color=ring_colours[i])

ax_polar.grid(False)
ax_polar.tick_params(axis='both', left=False, bottom=False, 
                   labelbottom=False, labelleft=True)

plt.show()

output

58895904cc0b57fb1baccb671fa62d2d.png

总之,Matplotlib不仅仅是一个功能强大的数据可视化库,它还可以作为一个有趣的工具,帮助我们在图像设计和艺术创作中发挥想象力。当然,这里展示的只是冰山一角。Matplotlib的潜力远不止于此,我们鼓励你深入挖掘它的功能,尝试更多有趣和创新的设计。

NO.1

往期推荐

Historical articles

简直太逆天了,使用Python来检测和识别车牌号码(附代码)

MySQL 常用脚本

介绍两个好用到爆的Python模块,建议收藏!!

嫌Python代码慢?这个模块让Python提效100倍!!

分享、收藏、点赞、在看安排一下?

1d3f9985a1a6a652913f4e8ce8282038.gif

75abc3c3b2cb79c8a26444e6850c71a6.gif

0b3181aa33100330511870717488eaa4.gif

7d1748cabd6f454feb07b6bbc57e120f.gif

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

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

相关文章

C语言数据结构+KMP算法next数组优化计算方法+优化后子串匹配代码实现

KMP算法next数组优化版 一.计算根据下列模式串计算出next数组二.优化next数组三.用优化后next的数组代码实现子串的匹配总结 通过我之前那篇KMP算法的讲解,我们可以快速手算KMP算法的next数组,但是之前计算的next数组在一些情况下会有缺陷,比如模式串’aaaab’和主串’aaabaaaa…

人人都能用,3s学会加密你的网址变成ooo

文章目录 1 前言2 原理及使用方法3 这玩意有什么用3.1 简单加密网址3.2 隐藏二级目录3.3 彩蛋:无限月读3.4 探讨性的加密应用 4 转换的代码4.1 将字符转为utf8数组4.2 将utf8数组转换为字符串4.3 最终转换4.4 用R来实现 5 讨论 1 前言 大家可以复制一下这个网址到浏…

[JavaEE初阶] 类加载机制

在真正的战争到来之前,尽可能地变得强大吧~ 文章目录 前言1. 类加载1.1 类加载的过程1.2 类加载的时机1.3 双亲委派模型 前言 这个问题是面试经典题,让我们来求甚解吧~ 1. 类加载 1.1 类加载的过程 如下图 加载,找到.class文件,读取文件内容验证,验证.class文件的格式是否…

IntelliJ IDEA 接入ChatGPT (免费,无需注册)生产力被干爆了!

IntelliJ IDEA 接入ChatGPT 前言 : 今天给大家介绍一款好用的 IntelliJ IDEA ChatGPT 插件 可以帮助我们写代码,以及语言上的处理工作,以及解释代码。让我们的生产力大大提高! 一. ChatGPT-Plus 功能介绍 支持最新idea版本AI询问功能,写好…

记录一次adb+frida+hook学习经过

adb连接模拟器 adb devices 查看adb 连接设备 offline 表示设备未连接成功或无响应,device 设备已连接 未连接就使用adb connect 127.0.0.1:端口号 各种模拟器端口号及模拟器连接方式_雷电模拟器 调式串口_宋学慧的博客-CSDN博客 举个栗子 常见adb命令 adb vers…

NXP公司LPC21XX+PID实现稳定温度控制

本例使用的是LPC21XX系列芯片提供的PWM功能实现稳定的温度控制。首先我们获得当前环境温度之后,再用设定的温度与当前温度相减,通过PID算法计算出当前输出脉宽,并将其输出到L298N模块中,使加热丝发热,形成闭环&#xf…

Java核心技术 卷1-总结-18

Java核心技术 卷1-总结-18 同步Volatile域final变量原子性死锁线程局部变量锁测试与超时读/写锁 同步 Volatile域 多处理器的计算机能够暂时在寄存器或本地内存缓冲区中保存内存中的值。结果是,运行在不同处理器上的线程可能在同一个内存位置取到不同的值。编译器…

建仓价和持仓价的应用:如何开仓如何持仓

建仓、持仓,是交易中绕不开的话题,没有建仓、持仓,何来建仓价、持仓价呢?所以这也是基础问题。不过作为市场形式的表现来说,建仓、持仓到后来的平仓贯彻始终,虽然是基础问题,也是后面登堂入室、…

【图数据库实践教程】Ubuntu22.04-Neo4j中文版安装及导入owl文件(通用教程)

文章目录 0. 环境准备0.1 静态配置IP:192.168.1.54,及网卡类型:NAT模式0.2 激活root用户:0.3 更改apt国内镜像源(下载快)0.4 关闭相关防火墙等保证网络顺畅 1. 相关软件安装1.1 安装好服务器内的相关软件1.…

FL Studio2023中文版数字音频工作站(DAW)软件

FL Studio21水果软件能支持制作各种音乐类型,除了最擅长的电子音乐,还可以任意创作流行音乐、古典音乐、民族音乐、乡村音乐、爵士乐等等,没有音乐类型的限制,让你的音乐突破想象力的限制。 FL Studio 2023中文版是数字音频工作站…

LINUX的系统管理与维护命令

文章目录 一、LINUX的系统管理与维护命令总结 一、LINUX的系统管理与维护命令 - Linux ls命令:显示指定工作目录下的内容 Linux pwd命令:显示当前工作目录 Linux cd命令:切换工作目录 Linux date命令:显示或设置系统时间 Linux su命令:切换用户 Linux clear命令:清除屏幕 Li…

5种简单快速的方法解除PDF文件密码保护

PDF 文件已经成为了我们日常工作、学习中广泛使用的文档格式之一。为了对重要的 PDF 文件进行保护,我们有时需要添加密码保护功能来防止未授权访问或修改。但是,如果您的 PDF 文件已经有了密码保护,而您需要快速访问和编辑它们,那…

机器人工程师与孔乙己文学

本文内容严格按创作模板发布: 孔乙已是鲁迅笔下人物,穷困流倒还穿着象征读书人的长衫,迁腐、麻木。最近,大家自我调佩是“当代孔乙己”,学历成为思想负担,找工作时高不成低不就。你可以从以下几个角度说说…

static_cast、dynamic_cast和reinterpret_cast区别和联系

其实网上相关的资料不少,但是能够说清楚明白这个问题的也不多。 于是,我尝试着问了一下AI,感觉回答还可以,但是需要更多的资料验证。 让我们先看看AI是怎么回答这个问题的。 static_cast、dynamic_cast和reinterpret_cast都是C中…

“SCSA-T学习导图+”系列:路由技术之OSPF入门

本期引言: 路由技术是网络环境中,为不同的节点传输数据提供传输路径的技术,企业网络的拓扑一般会比较复杂,不同的部门或者总部和分支可能处于不同的网段中,此时就需要使用路由协议来连接不同的网段,实现数…

Parker机电产品(运动控制/伺服电机/直线电机)在FPD行业应用

Parker新控制器-PAC PAC集高级逻辑控制,多轴运动,信号处理和webpublished可视化功能。 采用工业主流的EtherCAT运动控制协议,I/O扩展和第三方设备链接,结合应用开发软件PARKERAutomation Manager , PAC能为OEM需要的…

微信仿真平台的设计和实现(设计+源码)_kaic

摘要 现如今,科技的发展带动着环保方式的更新,Internet是一个不断的开展和不停的扩充数据潮流,有了它,我们可以快速、容易地在世界的任何角落进行沟通,获取更多的信息与资料。Internet可以提供大量信息资源和文案数据库…

临近五一,游玩地点想好了吗,Python帮你查找旅游景点的详细数据

前言 好不容易没有了疫情,三年整整三年,都要把我憋死了,想到去年暑假的时候,准备去厦门,攻略做好了,厦门疫情来了,想着转去济南也是这样,去三亚,结果收到好几万人都被留…

5G网络切片路由选择策略介绍

终端保存的NSSP(Network Slice Selection Policy)策略来源于网络侧。 NSSP规则是将应用程序匹配到S-NSSAI(Single network slice selection assistance information),并将应用程序绑定到现有PDU会话或发起新的PDU会话。 NSSP功能 NSSP的作用就是为应用程序选择S-NSSAI和…

HashMap如何解决哈希冲突

HashMap如何解决哈希冲突 Hash算法和Hash表Hash冲突解决哈希冲突的方法开放地址法链式寻址法再hash法建立公共溢出区 Hash算法和Hash表 Hash算法就是把任意长度的输入通过散列算法编程固定长度的输出。这个输出结果就是一个散列值。 Hash表又称为“散列表”,它是通…