让我开始向您显示以下图形:
看起来很熟悉,不是吗? 这称为条形图 。 我们通常使用不同的应用程序(例如Microsoft Excel和Microsoft Word)绘制它们。
如果我们想对图形创建过程进行更多控制,那么以编程方式创建此类图形将是最佳选择。
在本教程中,我将向您展示如何使用Python创建条形图。 准备?
我们需要什么模块?
为了执行绘制条形图的任务,我们将主要需要两个模块: Image模块和ImageDraw模块,这两个模块都将从Python Imaging Library(PIL)导入。 Image
模块将用于加载图像,而ImageDraw
模块将用于创建2D图形(即画一条线)。
提到PIL,让我向您展示如何安装它。 但我将向您展示如何安装枕头 。 原因是PIL的最新版本PIL 1.1.7于2009年发布,仅支持Python 1.5.2–2.7。 因此,它不支持Python 3.X,而且恐怕自从PIL项目的上一次提交是在2011年以来,它的开发就已经停止了。
Pillow派上了用场,因为它分叉了PIL存储库并添加了Python 3.X支持。 因此,为了使用Python 3.X的读者,我将使用Pillow。 但是,如果您使用的是以前的Python版本,则使用Pillow不会造成伤害。
安装枕
由于我当前正在Mac OS X El Capitan系统上编写本教程,因此本节中有关安装Pillow的步骤适用于Mac OS X用户,但是您可以按照其他操作系统的文档中的说明进行操作。
在Mac上安装Pillow的一种简单方法是通过pip ,可以通过在终端上键入以下简单命令来进行安装:
$ sudo easy_install pip
此时,只需键入以下内容即可安装枕头:
$ sudo pip install pillow
建立程序
现在,让我们逐步介绍该程序的构建块。 我们需要的第一件事是空白图像,我们将在其上绘制条形图。 您可以下载空白图像 。
现在让我们阅读此空白图像并绘制它。 我们可以这样做,如下所示:
from PIL import Image, ImageDraw
img = Image.open('blank.png')
draw_img = ImageDraw.Draw(img)
由于我们要绘制条形图,因此需要一些数据。 为此,我们可以使用list 。 因此,我们的数据(列表)可以如下所示:
data = ['4','5','87','1','44','83','93','2','54','84','100','64']
此时,我们所需要做的就是绘制条形图。 我们将在图上看到的条形图视为线。 因此,我们将使用ImageDraw
模块的line()
方法。
我将向您显示执行绘制条形图任务的代码,然后我将对其进行解释:
for i in data:
x = x + 30
y = 200 - int(i)
draw_img.line((x,200,x,y), width=10, fill=(255,0,0,255))
如您所见,我们遍历列表并使用列表中的数据绘制条形图。 x = x + 30
为我们提供了x轴列表中每个数据点之间的所需空间。 在继续之前,我想提醒您,图像上的(0,0)
点是轴的左上角 。 因此,就像在图形上标记点坐标时,将线颠倒到我们习惯的正常方式绘制。
如果我们跳到上一个脚本部分的最后一行,我们可以按如下方式阅读此部分draw_img.line((x,200, x,y)
:从点(x,200)
到点(x,y)
。因此,如果我们从第一个数据点4
,则线将从(34,200)
绘制到(34,196)
。因此,当我在一段时间(34,196)
您显示输出时,x轴将好像这就是我们通常习惯的(从(0,0)
的左下角开始)。这里的技巧是使用y = 200
如您所见,我们将始终在y = 200
绘制一条线对于所有数据点,这将使我们对我们在查看结果时在图形上绘制点的方式印象深刻。
width
表示线条的宽度(厚度),而fill=(255,0,0,255)
表示线条的颜色。 也就是说, RGBA
颜色(RGB颜色的扩展,其中Alpha通道代表不透明度)。
最后,我们可以使用以下语句查看图像: img.show()
。
放在一起
既然我们已经涵盖了程序的构建块,那么让我们将所有内容放在一起,看看脚本的外观如何:
from PIL import Image, ImageDraw
img = Image.open('blank.png')
draw_img = ImageDraw.Draw(img)
data = ['4','5','87','1','44','83','93','2','54','84','100','64']
x = 0
for i in data:
x = x + 30
y = 200 - int(i)
draw_img.line((x,200,x,y), width=10, fill=(255,0,0,255))
img.show()
输出量
现在是有趣的部分,上面的脚本的结果。 如果运行该程序,则应该具有与以下内容相似的内容:
我已在此快照中裁剪了图像的顶部; 它应该在原始输出中看起来更大。
结论
正如我们从本教程中看到的那样,为了获得对某些常规任务的更多控制,例如使用某种编程语言(例如Python)来绘制一些数据的图形,将是一种方法。
但是,我们不需要总是从头开始执行此类任务; 相反,我们可以从用户定义的库(例如本教程中的Pillow)中受益。 使用这样的库使我们可以轻松地绘制条形图,而使用Python则使我们可以控制和灵活地使用一些技巧以所需的方式输出图形。