如何使用 Python 在终端中创建令人惊叹的图形

news2024/11/18 19:31:45

说明

        在当今数据驱动的世界中,可视化或图形确实表达了一个胜过千言万语的故事。可视化提供了快速有效的通信媒体来传达数据,如果与文本或表格共享,则可能难以理解。

        虽然有许多强大的可视化工具可用,但有时我们需要一种快速简便的方法来直接在终端中可视化数据。无论我们是远程工作、在服务器上工作,还是只需要与同事共享快速可视化,在终端中绘制图形的能力都非常有用。

        让我们看一个简单的示例场景,我正在尝试从我的位置找出 AWS 区域的延迟。我得到了数据,现在想比较一下:

data = [
    {
        "#": 1,
        "AWS Region Name": "US East (N. Virginia)",
        "Region Code": "us-east-1",
        "Mean": "741 ms",
        "Median": "730 ms",
        "Min": "723 ms",
        "Max": "780 ms",
    },
    {
        "#": 2,
        "AWS Region Name": "US East (Ohio)",
        "Region Code": "us-east-2",
        "Mean": "525 ms",
        "Median": "530 ms",
        "Min": "244 ms",
        "Max": "797 ms",
    },
    {
        "#": 3,
        "AWS Region Name": "US West (N. California)",
        "Region Code": "us-west-1",
        "Mean": "540 ms",
        "Median": "535 ms",
        "Min": "270 ms",
        "Max": "819 ms",
    },
    {
        "#": 4,
        "AWS Region Name": "US West (Oregon)",
        "Region Code": "us-west-2",
        "Mean": "602 ms",
        "Median": "594 ms",
        "Min": "299 ms",
        "Max": "923 ms",
    },
    {
        "#": 5,
        "AWS Region Name": "Africa (Cape Town)",
        "Region Code": "af-south-1",
        "Mean": "632 ms",
        "Median": "627 ms",
        "Min": "320 ms",
        "Max": "953 ms",
    },
    {
        "#": 6,
        "AWS Region Name": "Asia Pacific (Melbourne)",
        "Region Code": "ap-southeast-4",
        "Mean": "599 ms",
        "Median": "598 ms",
        "Min": "296 ms",
        "Max": "905 ms",
    },
    {
        "#": 7,
        "AWS Region Name": "Asia Pacific (Hong Kong)",
        "Region Code": "ap-east-1",
        "Mean": "362 ms",
        "Median": "361 ms",
        "Min": "353 ms",
        "Max": "374 ms",
    },
]

print("\nAWS Ping Test results: ")
print("=========================")
for d in data:
    print(d["Region Code"], "\t", d["Mean"])


print("\nAWS Ping Test results: ")
print("=========================")
for d in data:
    ms = int(d["Mean"].replace(" ms", ""))
    ms_bar = round(ms / 10)
    print(d["Region Code"], "\t", "*" * ms_bar)

        输出如下:

        如果我们快速浏览一下,尽管两个表都为我们提供了相似的信息,但很容易在条形图中找到最低的延迟。从这个快速演示中,我们实际上可以看到这种 CLI 可视化的有用性。

        现在在某些情况下,绘制此类图形的快速辅助函数可能比导入外部模块更有用和高效。我们还将探索外部模块,但让我们先自己做!

def draw_bar(value, legend=None, char="❚"):
    if legend:
        print(legend, "\t", char * value)
    else:
        print(char * value)

print("\nAWS Ping Test results: ")
print("=========================")
for d in data:
    print(d["Region Code"], "\t", d["Mean"])


print("\nAWS Ping Test results: ")
print("=========================")
for d in data:
    ms = int(d["Mean"].replace(" ms", ""))
    ms_bar = round(ms / 10)
    # print(d["Region Code"], "\t", "*" * ms_bar)
    
    draw_bar(ms_bar, d["Region Code"])
    draw_bar(ms_bar, d["Region Code"], "☐")
    draw_bar(ms_bar, d["Region Code"], "░")

        在这里,我添加了一个简单的函数来绘制条形图,并使用了一些 Unicode 字符使图形比我们之前的示例更有趣和美观一些

        通过提供您自己的 Unicode 字符,可以根据您自己的选择或口味轻松更改(我的不是很好!证据在图片😂中)

        虽然一个简单的函数在这种情况下可能会有所帮助,但是,如果你的脚本需要更好的可视化,有一些非常好的外部模块,让我们探索一下这些,我已经在我的项目中使用了其中一些。

1. 终端图

        终端图是对于简单散点图非常有用的模块之一。它非常易于使用,只需几行代码即可添加到脚本中。

from terminalplot import plot

x = range(0, 100, 2)
y = [i**2 for i in x]
plot(x, y)

        这将导致以下结果:

        非常易于使用的模块的代价是不是很灵活,情节字符不可自定义,会打印“*”。此外,没有显示标签或绘图图例的选项。因此,如果您需要一个快速的解决方案来绘制任何类型的数学表达式,而无需非常微小的分辨率,那么它非常适合此目的

2.Asciichartpy

        这是 NPM 模块的 Python 移植版本,名称为 asciichart。这个我在我的一个项目中使用了这个模块pynetmon,如果你更感兴趣,你可以在这里阅读它,了解我如何在项目中使用它。

        回到模块,虽然 Python 的文档有点缺失,但它与 NodeJS 版本非常相似,所以很容易使用,让我们看一个例子:

import asciichartpy as acp
from random import randint

x = [randint(0, 10) for _ in range(100)]

print(acp.plot(x))

这将生成以下图表:

        这在需要绘制流数据的地方非常有用,这就是为什么我在pynetmon项目中使用它来绘制网络接口上的入口和出口数据。您还可以提供一些配置来自定义显示的单位或文本格式,以及一些可供探索或试验的更多选项。如果您正在构建基于文本的用户界面,它非常适合富库或文本库。

3. Termplot

        术语图类似于上面提到的终端图,但在自定义不同的绘图类型方面几乎没有更多的灵活性。

import math
from termplot import Plot
xvals, yvals = [], []
for i in range(0, 2000, 5):
    xx = i / 100.0
    xvals.append(xx)
    yvals.append(math.sin(xx) * float(i ** 0.5))
Plot(xvals, yvals, LINE)

这将产生以下散点图

来源: GitHub - justnoise/termplot: Plot data in your terminal

4. 术语图

        在这种情况下,如果您需要在终端中为任何类型的财务仪表板绘制烛台图,则此模块很有帮助。它只做一种类型的绘图,但使用 Unicode 字符集绘制烛台图确实令人印象深刻。它不是 pip 可安装的,并且有一个同名的 pip 模块,所以要小心歧义,现在您只能通过将源克隆到您的项目中来使用它。

        下面是一个从Windows终端上的CSV数据呈现OHLC图表的示例Termgraph:

终端上的术语图OHLC!

5. 剧情

Plotile使用了一种非常酷的方法,使用盲文点来打印一些非常好的分辨率图表。与上面提到的其他模块相比,这是相对较新的模块之一。我实际上正在考虑将 Plotile 与 asciichart 交换为 pynetmon 图。

它非常易于使用并集成到任何脚本中,让我们检查一个例子:

import plotille
import psutil

temps = []
n = []
for i in range(100):
    n.append(i)
    temps.append(psutil.cpu_percent(interval=0.1))

fig = plotille.Figure()
print(plotille.plot(n, temps, height=30, width=60, interp="linear", lc="cyan"))

        在示例中,我每 0.1 秒将系统的 CPU 使用率存储到一个列表中,这是为了在实际应用程序中简单起见,我们可能会实时执行此操作,但现在让我们检查结果:

        如您所见,图形分辨率更精确,美观性更好,该模块也易于定制,因此您可以轻松更改线条颜色、背景等。

        在示例中,我只使用了一个简单的图,也有散点图或直方图可用。此外,如果您需要可以通过操作 Canvas 来完成的自定义图形。甚至图像也可以在 Canvas 中渲染,如下所示

来源:剧情示例

很酷不是吗,如果您对ASCII艺术感兴趣,还可以实现很多可能性。

6. 术语图

        到目前为止讨论的库的常见模式主要限于线图、条形图和散点图。但是,如果您需要绘制一个漂亮的饼图或圆环图,(是的,那些通常来自冗长而无聊会议的商业演示的循环内容可以很容易地通过电子邮件传达,但是嘿,这很有趣,让我们邀请所有人并浪费 30 分钟的时间,最终🤣一无所获,对不起咆哮, 但你明白了要点。

        现在的TLDR;术语图允许您在终端中打印饼图和圆环图,默认情况下使用冷色组合。

对于我们的示例,让我们绘制我全天的精彩时间表:

import termcharts
from rich import print
from rich.layout import Layout
from rich.panel import Panel

data = {"Work": 8, "Sleep": 6, "Gaming": 4, "Netflix": 4, "Misc": 2}

chart1 = termcharts.bar(data, title="Time of my life", rich=True)
chart2 = termcharts.bar(data, title="Time of my life", mode="v", rich=True)  # vertical

chart_pie = termcharts.pie(data, title="Time of my life", rich=True)

chart_donut = termcharts.doughnut(data, title="Time of my life", rich=True)

layout = Layout()
layout.split_column(Layout(name="upper"), Layout(name="lower"))
layout["upper"].split_row(
    Layout(name="uleft"),
    Layout(name="uright"),
)
layout["lower"].split_row(
    Layout(name="lleft"),
    Layout(name="lright"),
)
layout["uleft"].update(Panel(chart1))
layout["uright"].update(Panel(chart2))
layout["lleft"].update(Panel(chart_pie))
layout["lright"].update(Panel(chart_donut))

print(layout)

这将导致以下结果(免责声明我远未达到这种生产力水平或调度😆,这只是为了演示目的,死星也不是图表的一部分,只是我的终端背景。

如果需要,此模块可以很好地添加到需要此类图表在终端上呈现的任何类型的仪表板。

7. 正文

到目前为止,Plotext可能是我们在本文中讨论的最通用的模块(我将其保存到最后一个,真是巧合! 💡Plotext支持大多数类型的图表,包括散点图,折线图,条形图,直方图,日期时间(时间序列),烛台一些特殊类型的图表,如误差图,混淆矩阵,事件时间线等。它可以显示图像和gif,不仅可以在终端上播放视频,还可以直接从youtube播放!

是时候举一些例子了,让我们先尝试一下烛台图,我们之前用termgraph做过一个,但我个人认为plotext分辨率要好一些。

import plotext as plt
import yfinance as yf

plt.date_form("d/m/Y")
start = plt.string_to_datetime("01/01/2023")
end = plt.today_datetime()
data = yf.download("SPY", start, end)
dates = plt.datetimes_to_string(data.index)

plt.clf()
plt.theme("dark")
plt.candlestick(dates, data)
plt.title("SPY Stock Price CandleSticks")

plt.show()

        我已将主题更改为黑暗模式,以便黑暗面拥抱者不会灼伤他们的眼睛!默认主题是白色的,类似于我们过去在 matplotlib 图表中看到的主题。蜡烛图如下所示:

图谱烛台图表

        对于视频演示,我将使用每个人一直以来最喜欢的视频,您很快就会看到!

import plotext as plt

src = "./Rick_Astley_Never_Gonna_Give_You_Up.mp4"
plt.play_video(src, from_youtube=True)

        Plotext提到它可以直接播放来自Youtube的视频,但是当我尝试时,我无法播放它,并且弹出了很多依赖项问题,所以我使用了本地视频文件。

Rick Rolling 在 Windows 终端上通过 Plotext

        所以现在我们也可以在航站楼享受里克·阿什利!如果删除或设置为 False,则需要播放音频,只有视频将在没有音频的情况下播放。from_youtube=True

        就是这样,我分享了 7 个很酷的模块,您可以将这些模块集成到您的下一个终端脚本或项目中,使它们看起来令人惊叹!

        如果您喜欢这篇文章并希望支持或鼓励我,请随时关注我或订阅我的时事通讯或在Twitter上关注我。

另外,如果你想支持我未来的博客努力,你可以给我买咖啡!

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

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

相关文章

SpringBoot的多环境切换(已废除)

profile是Spring对不同环境提供不同配置功能的支持,可以通过激活不同的环境版本,实现快速切换环境 application-dev.yaml server:port: 8082 application-test.yaml server:port: 8081 我们在主配置文件编写的时候,文件名可以是 applicat…

58 乘积最大子数组

乘积最大子数组 题解1 DP换成三个变量(因为是连续的,只和上一个状态有关的,所以三个暂存变量迭代就行) 给你一个整数数组 nums ,请你找出数组中乘积最大的 非空连续子数组(该子数组中至少包含一个数字&am…

出席第三届“一带一路”峰会的斯里兰卡总统会见深兰科技高层

10月16日,应斯里兰卡投资促进部的邀请,深兰科技集团董事副总裁刘园桂、集团营销中心总经理徐诗彪一行出席了在北京举行的“中斯投资论坛”。 图:刘园桂女士向斯里兰卡总统赠送熊猫智能公交模型 论坛期间,来北京参加第三届“一带一…

菜鸟智谷产业园正式开园!入驻企业可享受“城区+园区”双重政策扶持

位于杭州未来科技城的菜鸟智谷产业园正式开园了! 杭州未来科技城发布新电商产业加速“百千万亿”计划,菜鸟智谷产业园发布“产业赋能计划”,并设立天猫品牌孵化基地,落户中国(杭州)跨境电商综试区一带一路电商运营中心,引入悦汇跨境产业创新基金……10月17日,杭州未来科技城(海…

【ELK 使用指南 1】ELK + Filebeat 分布式日志管理平台部署

ELK和EFLK 一、前言1.1 日志分析的作用1.2 需要收集的日志1.3 完整日志系统的基本特征 二、ELK概述2.1 ELK简介2.2 为什么要用ELK?2.3 ELK的组件 三、ELK组件详解3.1 Logstash3.1.1 简介3.1.2 Logstash命令常用选项3.1.3 Logstash 的输入和输出流3.1.4 Logstash配置文件 3.2 E…

客户开发信怎么写?新手如何发客户开发信?

客户开发信模板有哪些?编写外贸客户邮件的技巧? 客户开发信是一种重要的商业沟通工具,用于建立和维护与现有客户之间的联系,以及吸引新客户。写一封成功的客户开发信需要一定的技巧和策略。在这篇文章中,我们将介绍如…

数据结构:二叉树(2)

二叉树的基本操作 获取树的结点总数 遍历思路: 每次遍历一个节点,遍历完nodeSize,然后遍历它的左右子树 如果遍历到空的节点,就返回0 public int nodeSize 0;int size(TreeNode root){if(root null){return 0;}nodeSize;siz…

智慧公厕:探索未来城市环境卫生设施建设新标杆

智慧公厕是当代城市建设的一项重要举措,它集先进技术、人性化设计和智能管理于一体,为人们提供更为舒适、便捷和卫生的厕所环境。现代智慧公厕的功能异常丰富,从厕位监测到多媒体信息交互,从自动化清洁到环境调控,每一…

电商数据平台西域根据ID取商品详情API接口采集产品详情数据、价格 、销量数据操作指南

商品详情API接口是一种用于访问和获取商品信息的接口,通常用于连接电商平台和商家应用程序。这个接口可以提供有关商品的各种详细信息,如名称、价格、描述、图片、类别、库存和评价等。它使得开发者能够为平台上的消费者提供更个性化和定制化的购物体验&…

通达OA saas化改造

登录页增加选择单位下拉菜单 <tr height"37" class"login_field"><td align"center"><b>用户名</b> <input type"text" class"text" name"UNAME" size"15" onmouseover&qu…

配电房无人值守方案

随着科技的不断进步&#xff0c;许多传统需要人工操作和维护的领域逐渐被自动化和智能化方案所替代。配电房作为电力供应的核心部分&#xff0c;也面临着同样的变革。 力安科技电易云配电室无人值守监控系统以智能物联数据采集和智能物联管控"为关键&#xff0c;通过加…

家装家具经营小程序商城的作用是什么

无论富贫&#xff0c;家里家具总是不可少的&#xff0c;也是人们生活所需&#xff0c;随着人们生活质量提升&#xff0c;市场中各式家装家具品牌也非常多&#xff0c;琳琅满目的商场里价格/质量高低可供消费者自由选择。 随着线上电商快速崛起&#xff0c;由于线上具备多品牌汇…

接口自动化测试难点:数据库验证解决方案!

接口自动化中的数据库验证&#xff1a;确保数据的一致性和准确性 接口自动化测试是现代软件开发中不可或缺的一环&#xff0c;而数据库验证则是确保接口返回数据与数据库中的数据一致性的重要步骤。本文将介绍接口自动化中的数据库验证的原理、步骤以及示例代码&#xff0c;帮…

数字电路设计得力助手——《Design Compiler User Guide》

在当今数字化时代&#xff0c;电子设备和芯片的需求日益增长&#xff0c;这使得数字电路设计变得愈发重要。在数字电路设计过程中&#xff0c;使用先进的工具和技术是至关重要的。Synopsys公司的Design Compiler就是这样一款备受推崇的设计编译器软件&#xff0c;而其详尽的用户…

Android DI框架-Hilt

到底该如何理解<依赖注入> 模版代码&#xff1a;食之无味&#xff0c;弃之可惜 public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);TextView mTextView(TextView) findVi…

vueday01——双向绑定

1.在template里面创建一个button&#xff08;原生的不需要导入&#xff09; <button click"myclick()">数值是{{ count }}</button> 2.在setup里面声明变量和方法&#xff0c;以及将其导出 setup() {const count ref(0);const myclick () >{count.…

ROC与AUC与主动学习评价指标ALC

首先需要关注一下什么是混淆矩阵&#xff0c;此处认为1为正类&#xff0c;0为负类 预测为0预测为1真实为0TN真负例&#xff08;预测为0&#xff0c;真实也为0&#xff09;FP假正例&#xff08;预测为1&#xff0c;但真实为0&#xff09;真实为1FN假负例&#xff08;预测为0&am…

VUE 快速上手与基础指令(内附详细案例)

文章目录 前言一、vue快速上手1. vue是什么2. 创建一个vue实例3. 插值表达式4. vue的响应式特性5. 开发者工具安装 二、vue指令1. v-html2. v-if 和 v-show3. v-else 和 v-else-if4. v-on5. v-bind6. 案例-波仔的学习之旅7. v-for8. 案例-小黑的书架9. v-for 中的key10. v-mode…

Python 框架学习 Django篇 (三) 链接数据库

只要你是做后端开发的&#xff0c;那么就离不开各种数据库&#xff0c;Django框架对各种数据库都非常友好&#xff0c;比如常见的PostgreSQL、MySQL、SQLite、Oracle&#xff0c;django都对他们提供了统一调用api&#xff0c;我们这里主要使用mysql数据库作为演示 一、ORM机制 …

报考阿里云acp认证,你得到的是什么?

放眼全球能够和亚马逊AWS、微软Azure竞争的&#xff0c;国内也就只有阿里云了。 阿里云目前稳居国内云计算市场第一&#xff0c;比排后面5名同行市场占有率的总和还要多&#xff0c;全球云计算市场&#xff0c;阿里云目前排名第3位。 阿里云的市场占有率说明市场对于阿里云产…