Python 绘制图表

本文将讲解如何在轻量应用服务器Lighthouse等云服务器上通过display、Python、Matplotlib等工具查看和绘制各类图表。

0x00 背景概述

工程师小王最近在折腾些性能统计分析的工作,所有的数据记录都在云服务器端,他很好奇如何在服务器端画图表并且方便地实时查看呢?对于这类需求任务,最方便的做法就是在云服务器上用Matpotlib等绘图工具搞定了,本地不需要任何软件,仅用SSH客户端登录即可。

那么,让我们首先在腾讯云创建一台可以把玩的云服务器吧!(当然,如果你已经有了一台可以远程登录并使用的云服务器,可以选择跳过下一节,直接开始“SSH X11连接”部分。)

0x01 服务器准备

服务器准备,当然还是选用咱们的主角: 腾讯云轻量应用服务器Lighthouse产品等,也是完全可以的。Lighthouse实例是当下最流行最方便的创建云主机方式,小实验用起来最爽快。

购买机器

下图是Lighthouse的创建页面,到这里选择一款喜欢的吧->

这里我们创建一台香港地域的镜像为Ubuntu 20.04LTS版本的实例,这是Ubuntu最新的LTS(长期维护)版本,可以体验更多新特性,后续我们也会在这个系统上做些简单实验。套餐选择上,可以根据自己的需求选择,本教程以4核的套餐举例。可以感到相当清简的购买流程,需要输入实例名称并选择下时长即可,购买体验非常流畅。

Python 绘制图表

我们创建完成后,可以在实例列表页面看到实例状态,当实例状态为运行中时,点击更多->管理即可进入管理页面了。我们将在管理页面为我们的Lighthouse主机重置密码,以方便后续的SSH登录。

重置密码

Lighthouse实例默认仅能从腾讯云控制台免密登录(本质是使用了默认密钥),为了可以后续通过SSH命令进行代理访问,最方便的方法是通过密码登录。

我们需要为我们的实例重置密码,可以在控制台的实例详情页面完成此类操作。通过“指定用户名”更新lighthouse用户的密码即可。

Python 绘制图表

注意:此步骤需要重启实例。然后即可通过SSH客户端软件验证密码登录了。这里也完全可以选择为其他(已创建的)用户更新密码。

0x02 SSH X11连接

相信大家都会使用SSH客户端连接Linux远程主机,然后通过命令行CLI——通常是shell——来与主机进行交互。但是如果想执行那些安装在远端Linux主机上的图形用户界面(也叫GUI,Graphical User Interface)的程序,比如GVim/PyCharm编辑器、Firefox浏览器等应用程序,那该怎么办呢?

这时候就需要通过SSH的X11 forwarding的功能来实现了。通过X11 forwarding,可以以将运行在远端主机上的应用程序的窗口屏幕转发至本地主机上,进而可以方便本地直接使用远程主机上的GUI应用程序。远端的主机甚至根本无需安装X server或任何图形化的桌面系统(如Gnome/KDE等)。

建立支持X11 Fowarding的SSH连接

在SSH会话中实现X11 Forwarding需要SSH的服务器端和客户端都支持,目前较新发行版的系统SSH服务器端配置都是默认支持的。所以,我们在建立SSH会话连接时,只需通过增加-X参数,就可以方便地启用SSH的X11 Forwarding功能,具体命令如下所示:

ssh -X lighthouse@YOUR-HOST-IP

什么是X11?X11 其实是 X Window System的简称,是类Unix、现代Linux系统上支持窗口化显示的框架及服务。X11起源于1984年,前身是MIT的Athena项目,它采用Client/Server架构,使得用户可以仅仅通过网络终端即可使用各种输入(如键盘/鼠标)输出(如显示器)设备来访问使用主机上的GUI程序。在现代Linux系统中,X server服务为系统提供相对底层的图形用户界面的支持,很多Linux桌面窗口系统也都建立在X11之上。

查看远端Linux主机上的图片

安装graphicsmagick软件包,里面包含各类图片处理相关的库以及我们后续需要的display命令。

sudo apt install graphicsmagick-imagemagick-compat
display

执行display命令后,我们可以看到本地主机会弹出一个新窗口,展示了GraphicsMagick的默认图片,X11 Forwarding成功。

Python 绘制图表

diplay命令是GraphicsMagick的“前端工具”,它不仅能浏览图片,还能修改图片,如放大缩小、旋转剪裁、甚至添加模糊/锐化等效果,本文不过多详细介绍。当然我们可以用display命令查看指定的图片,如:

display my-demo-image.png

如果SSH连接时,忘记指定-X参数的话,运行display命令时会报类似地错误,它通常意味着X11 Forwarding没有打开。

lighthouse@VM-0-11-ubuntu:~$ display
display display: Unable to open X server ().

运行其他GUI程序

当然,只要服务器性能以及网络带宽足够,甚至还可以打开远端服务器上的GVim、Firefox、Visual Studio Code、PyCharm等多种桌面应用。

Python 绘制图表

上图中可以看到,已打开的gvim和firefox是运行在远程服务器上的GUI应用,(实验的本地主机是没有这两个应用程序的)只是通过SSH X11转发将程序窗口显示转到本地。这就是X11 Forwarding功能的强大之处,体验下吧。下面我们准备开始绘图的工作!

0x03 安装Matplotlib

Matplotlib简介

Matplotlib,是用于绘制各种图表(包括静态图、动图、甚至交互图)的Python库。Matplotlib当前已经到v3版本,是Python社区最流行的绘图工具,因其简单的接口使用以及愈发丰富活跃的社区,已被广泛地应用于各类科研教学、工程实验实践、项目分析等各类涉及数据分析的实用场景。比较常用的折线图、条形图、直方图、散点图,函数曲线图、饼图甚至3D图都可以用它来绘制。Matplotlib最开始诞生于2012年,并开源(BSD协议),支持Python2和Python3。Numpy、Scipy等多个主流的数值计算库都与其关系紧密。目前Matplotlib可谓Python社区中数据可视化工具的集大成者。下面是其官网截图(部分):

Python 绘制图表

Matplotlib安装

Matplotlib当前的最新release版是v3.3.2版本(如上图所示),Lighthouse的Ubuntu 20.04LTS下,pip可以直接安装该最新版本。通过pip安装两部即可:

# 安装python3的pip
sudo apt install python3-pip
# 安装matplotlib
pip3 install matplotlib

Matplotlib 安装验证

python3 -c "import matplotlib; print(matplotlib.__version__)"
# 会输出显示matplotlib的版本号,即安装成功
$ 3.3.2

0x04 Matplotlib示例——数据统计图

本节介绍下最常用的统计图类的绘制示例。统计图常用于各类数据报表的展示与记录,常见的形式有折线图、直方图、散点图等。通过matplotlib,我们可以通过很简单的近乎声明式的脚本定义图表的各类元素,并把它存储为指定的文件格式。代码如下:

import matplotlib.pyplot as plt 
​
plt.title('HTTP Performance Benchmark')
plt.xlabel('Connection (users)')
plt.ylabel('Throughput (requests/second)')
​
plt.axis([0, 2200, 0, 25000])
​
plt.plot(
    [100, 500, 1000, 1500, 2000],
    [21413, 20905, 18679, 17704, 17403],
    color='r', marker='d', linestyle='-',
    label='Rust v1.28.0'
)
​
plt.plot(
    [100, 500, 1000, 1500, 2000],
    [16930, 16532, 16289, 15856, 15563],
    color='b', marker='h', linestyle='-',
    label='Go v1.11.1'
)
​
plt.plot(
    [100, 500, 1000, 1500, 2000],
    [14845, 14647, 13878, 13389, 13133],
    color='g', marker='v', linestyle='-',
    label='Node.js v8.11.4'
)
​
plt.plot(
    [100, 500, 1000, 1500, 2000],
    [5942, 5392, 4461, 4239, 3678],
    color='y', marker='o', linestyle='-',
    label='Python v3.5.2'
)
​
plt.legend()
                
plt.savefig('perf.svg')

代码相信不难理解,matplotlib设计的接口都非常直接:比如title()xlabel()就是直接定义图上相关元素;savefig()就是存储文件,注意可以指定文件格式(如svg,png)等。plot()方法就是定义绘制一系列点,第一个参数是x轴序列值,第二个参数是y轴序列值。coler(色彩)、marker(点型)、linestyle(线型)等样式相关的定义也可以在此设置,详见文档详细介绍,在此不赘述。

脚本编写完毕后,python3直接运行脚本即可,运行后会在当前目录生成perf.svg(代码中定义的)文件,通过display命令显示的该折线图,如下:

Python 绘制图表

0x05 Matplotlib示例——多函数曲线

除了已有数据的统计图,我们还可用Matplotlib绘制函数曲线图,并且同时绘制多个曲线。不同于上一节的场景,这类图的y轴数值是通过x数值动态计算出来的,而非一开始就明确。常用于数学分析、物理工程领域的建模研究。本节我们选择基本的简谐振动曲线,以方便讲解,示例代码如下:

import numpy as np
import matplotlib.pyplot as plt
​
# Data for plotting
x1 = np.linspace(0.0, np.pi)
x2 = np.linspace(0.0, np.pi)
x3 = np.linspace(0.0, np.pi)
y1 = np.cos(2 * np.pi * x1 - np.pi)
y2 = np.cos(2 * np.pi * x2)
y3 = np.cos(2 * np.pi * x3) * np.exp(-x3)
​
# Create 3 subplots sharing y axis
fig, (ax1, ax2, ax3) = plt.subplots(3, sharey=True)
​
ax1.plot(x1, y1, 'b.-')
ax1.set(title='exapmple of 3 subplots', xlabel='time (s)', ylabel='Undamped')
​
ax2.plot(x2, y2, 'g.-')
ax2.set(xlabel='time (s)', ylabel='Undamped')
​
ax3.plot(x3, y3, 'ko-')
ax3.set(xlabel='time (s)', ylabel='Damped oscillation')
​
plt.show()

我们导入了numpy数值计算库,用于后续的一些函数/常量引用。numpy库和matplotlib一起使用是非常自然的。x轴变量通过linspace()设置定义域区间,y轴即函数定义。通过subplots()定义图表(即Figure),每个Figure可以包括多个子图(subplot),在定义时可以通过第一个参数指定子图的数量。这里我们用绘制3个图然后分别执行plot()方法。并且我们的三个子图对齐y轴(通过sharey参数),且x轴定义域相同,可以更加直观地比较不同初相位和阻尼所带来地影响,程序运行后,会直接弹出绘图窗口,显示绘制结果:

Python 绘制图表

注意,我们没有用savefig()保存图片文件,而用了show()方法直接最后显示,更方便调试。若要结束程序,关闭窗口或Ctrl+C均可。

0x06 小结

相信看到这里,你已经对在轻量应用服务器Lighthouse上如何用Python/Matplotlib等工具绘图有了基本的认识和掌握,是不是感觉蛮有意思的呢?

其实Matplotlib功能非常强大,还有对散点图、热度图、3D图等多种支持,甚至还可以保存绘制过程为动图/视频,更加直观的显示数据之间的关系。后续我们在相关应用场景下还会再进一步介绍,敬请持续关注本专栏。

当然最重要的,还是多在Lighthouse等云服务器产品中大胆尝试体验它,收获更多探求和学习的乐趣!玩得愉快~

0x07 参考资料

本文来自腾讯云计算社区,转载请注明出处:https://computeinit.com/archives/2807

发表评论

登录后才能评论
交流群