如何高效地使用管理子系统

圆舞曲之王2022-07-06  16

介绍

Python可视化对于初学者来说有点令人沮丧。有许多不同的选择,如何选择正确的是一个挑战。例如,两年前,这篇文章“Python可视化工具概述”(。

现在我已经学会了一些工具以及如何用Matplotlib来使用,Matplotlib也逐渐成为了一个必备的工具。本文将展示如何使用Matplotlib。我坚信Matplotlib是Python数据科学堆栈中必不可少的一部分。我希望这篇文章能帮助你理解如何使用Matplotlib进行Python可视化。

为什么大家都在否定Matplotlib?

在我看来,Matplotlib对初学者来说比较难,原因有几个。首先,Matplotlib有两个接口。第一个界面基于MATLAB,使用基于状态的界面。第二个接口是面向对象的接口。本文不会介绍Matplotlib有两个接口的原因,但是用Matplotlib画图时了解这两个方法很重要。两个接口混淆的原因是堆栈溢出和通过Google搜索获得的大量信息。新用户会发现问题的多种解决方案,但这些问题看起来相似,但并不完全相同。以我个人的经验,从之前的代码中可以看出Matplotlib代码存在一些混乱,对此我感到很困惑(尽管我是编写它们的人...):-)

要点

Plotlib的新手应该学习和使用面向对象的接口。

使用Matplotlib的另一个历史性挑战是一些默认样式没有吸引力。r在ggplot可以生成相当好的图形的世界里,Matplotlib相对来说比较难看。好消息是Matplotlib 2.0中的样式看起来更好,并且您可以用最少的努力生成可视化效果。

第三个挑战是你不确定什么时候用Matplotlib,什么时候用基于Matplotlib构建的工具,比如熊猫或者seaborn。很多时候,做一件事有很多选择,但对于一个新手来说,选择正确的路径有点困难。这种混淆和两种不同API的混淆简直就是败笔...

为什么要用Matplotlib?

虽然Matplotlib有这么多问题,但我喜欢用它,因为它功能强大。这个库允许你创建几乎所有的可视化。此外,围绕Matplotlib还有丰富的Python工具生态系统,很多更高级的可视化工具都使用Matplotlib作为基础库。如果你想在Python数据科学栈中做任何事情,你需要有一些关于如何使用Matplotlib的基础知识。这是本文其余部分的重点——提供有效使用Matplotlib的基本方法。

先决条件

建议按照以下步骤学习如何使用Matplotlib:

1.学习Matplotlib的基本术语,特别是什么是图形和轴。

2.始终使用面向对象的接口,并习惯它。

3.从基本的熊猫图开始可视化。

4.使用seaborn进行稍微复杂的数据可视化。

5.用Matplotlib定制熊猫或海兽可视化。

下图对于理解该图的不同术语非常重要。

大多数术语简单易懂。重要的是要记住,图形是可能包含一个或多个轴的最终图像。Axes代表单个图形。一旦您理解了这些是什么以及如何通过面向对象的API来评估它们,剩下的步骤就简单了。

了解这些知识的另一个好处是,你在网上看东西就有了一个起点。如果你花时间理解这一点,那么其他Matplotlib API是有意义的。另外,很多高级的Python包,比如seaborn和ggplot,都是依靠Matplotlib来构建的,所以通过了解基础知识,更容易学习更强大的框架。

最后,我不是说你应该避免其他优秀的选项,如ggplot(又名ggpy),bokeh,plotly或altair。我只是觉得你需要对matplotlib+pandas+seaborn有一个基本的了解。在理解了基本的可视化堆栈之后,您可以探索其他优秀的工具,并根据您的需要做出适当的选择。

开始

下面主要介绍如何在pandas中创建基本的可视化,并使用Matplotlib自定义最常用的项目。了解基本流程有助于更直观地定制。

我主要关注最常见的画图任务,比如标注轴,调整图形界限,更新图形标题,保存图像,调整图例。

首先,我将设置输入并读取一些数据:

进口熊猫作为pd

将matplotlib.pyplot作为plt导入

从matplotlib.ticker导入FuncFormatter

df = pd.read_excel(" ")

df.head

包括2014年的销量。为简洁起见,我将总结这些数据,列出前十名客户的购买次数和交易金额。我将在绘制时重命名列。

top_10 = (df.groupby('名称')['外部价格','数量']。agg({ '外部价格':'总和','数量':'计数' })

。sort_values(by='ext price ',ascending=False))[:10]。重置_索引

top _ 10 . rename(columns = { ' Name ':' Name ',' ext price': 'Sales ',' quantity': 'Purchases'},inplace=True)

下图是数据。

现在数据以简单的表格形式呈现,让我们看看如何将数据绘制成条形图。如前所述,Matplotlib有许多不同的样式,可以用来渲染图表。您可以使用plt.style.available来检查适用于您的系统的样式。

plt.style .可用

['海波恩-黑暗',

“海滨-深色-调色板”,

五点三十八分,

seaborn-whitegrid ',

“海洋-黑暗网格”,

海博恩,

bmh ',

经典',

seaborn-色盲,

海风-静音',

“seaborn-white”,

“海上谈话”,

灰度',

深色_背景',

“海洋深处”,

“锡伯恩-布莱特”,

ggplot ',

seaborn-paper,

“海洋笔记本”,

《海边的海报》,

海滨蜱,

seaborn-pastel']

使用下面的简单样式:

plt.style.use('ggplot ')

我鼓励你使用不同的风格,找到你喜欢的。

现在我们有了一个好看的样式,第一步是使用标准的熊猫绘图功能来绘制数据:

top_10.plot(kind='barh ',y="Sales ",x="Name ")

推荐使用熊猫图,因为这是一种快速便捷的建立视觉原型的方法。

自定义图表

如果您对图表的所有重要部分都满意,那么下一步就是定制它。一些定制(如添加标题和标签)可以通过使用熊猫绘图功能轻松完成。然而,你可能会发现自己在某些时候需要跳出去。这就是为什么我建议你养成以下习惯:

图,ax = plt.subplots

top_10.plot(kind='barh ',y="Sales ",x="Name ",ax=ax)

生成的图表与原始图表基本相同,但我们增加了一个对plt.subplots的额外调用,并将ax转移到绘图函数。为什么要这么做?还记得我说过在Matplotlib中获取轴和图像很关键吗?这里所做的就是为了实现这个目标。您可以通过ax或fig对象执行任何定制。

我们用熊猫来实现快速画图,现在用Matplotlib来获取所有函数。通过使用命名约定,使别人的解决方案适应您自己的需求变得更加直接和简单。

假设我们想要调整x限制并更改一些轴标签。现在我们在ax变量中有了多个轴,我们可以做一些操作:

图,ax = plt.subplots

top_10.plot(kind='barh ',y="Sales ",x="Name ",ax=ax)

ax.set_xlim([-10000,140000])

ax.set_xlabel('总收入')

ax . set _ y label(' Customer ');

这是更改标题和标签的另一种简单方法:

图,ax = plt.subplots

top_10.plot(kind='barh ',y="Sales ",x="Name ",ax=ax)

ax.set_xlim([-10000,140000])

ax.set(title='2014年收入',xlabel= '总收入',ylabel= '客户')

为了进一步演示这种方法,我们还可以调整图像大小。使用plt.subplots函数以英寸为单位定义figsize。我们还可以使用ax.legend.set_visible(False)来删除图例。

fig,ax = plt.subplots(figsize=(5,6))

top_10.plot(kind='barh ',y="Sales ",x="Name ",ax=ax)

ax.set_xlim([-10000,140000])

ax.set(title='2014年收入',xlabel= '总收入')

ax.legend.set_visible(False)

要修改此图像,您可能需要执行许多操作。也许图表中最难看的是总收入的格式。Matplotlib可以使用FuncFormatter来解决这个问题。这个函数是通用的,允许将用户定义的函数应用于值并返回格式良好的字符串。

下面是货币格式化函数,用于处理几十万美元范围的值:

定义货币(x,位置):

这两个参数是值和刻度位置

如果x = 1000000:

返回' ${:1.1f}M '。格式(x*1e-6)

返回' ${:1.0f}K '。格式(x*1e-3)

现在我们有了格式化函数,我们需要定义它并将其应用到X轴。完整的代码如下:

图,ax = plt.subplots

top_10.plot(kind='barh ',y="Sales ",x="Name ",ax=ax)

ax.set_xlim([-10000,140000])

ax.set(title='2014年收入',xlabel= '总收入',ylabel= '客户')

formatter = FuncFormatter(货币)

ax.xaxis.set_major_formatter(格式化程序)

ax.legend.set_visible(False)

这张图漂亮多了,展示了定制问题解决方案的灵活性。最后一个自定义特性是向图表添加注释。可以使用ax.axvline绘制垂直线,使用ax.text添加自定义文本。对于上面的例子,我们可以画一条代表平均值的线,包括代表3个新客户的标签。以下是完整的代码:

#创建图形和轴

图,ax = plt.subplots

#绘制数据并获得平均值

top_10.plot(kind='barh ',y="Sales ",x="Name ",ax=ax)

avg = top_10['Sales']。意思是

#设置限制和标签

ax.set_xlim([-10000,140000])

ax.set(title='2014年收入',xlabel= '总收入',ylabel= '客户')

#为平均值添加一条线

ax.axvline(x=avg,color='b ',label='Average ',linestyle=' -',linewidth=1)

#注释新客户

对于[3,5,8]中的客户:

ax.text(115000,cust,“新客户”)

#格式化货币

formatter = FuncFormatter(货币)

ax.xaxis.set_major_formatter(格式化程序)

#隐藏传奇

ax.legend.set_visible(False)

这可能不是最壮观的图片,但它确实显示了使用这种方法的力量。

图表

目前,我们所做的所有更改都是针对单个图表的。我们还可以向图像中添加多个表格,并用不同的选项保存整个图像。

如果我们确定在同一个图像上放置两个表,那么我们应该对如何做有一个基本的了解。首先,创建图像,然后是轴,然后将它们绘制成图表。使用plt.subplots可以做到这一点:

fig,(ax0,ax1) = plt.subplots(nrows=1,ncols=2,sharey=True,figsize=(7,4))

在这个例子中,我使用nrows和ncols来指定大小,这对于新用户来说是清晰易懂的。

在示例代码中,您经常会看到1和2这样的变量。我认为使用命名参数可以使以后查看代码时更容易理解。

我还使用sharey=True让Y轴共享同一个标签。

这个例子是灵活的,因为不同的轴可以被解压缩成ax0和ax1。现在我们有了这些轴,我们可以像上面的例子那样画,然后把一个图形放在ax0上,另一个放在ax1上。

#拿着图和轴

fig,(ax0,ax1) = plt.subplots(nrows=1,ncols=2,sharey=True,figsize=(7,4))

top_10.plot(kind='barh ',y="Sales ",x="Name ",ax=ax0)

ax0.set_xlim([-10000,140000])

ax0.set(title='Revenue ',xlabel='Total Revenue ',ylabel='Customers ')

#将平均值绘制成垂直线

avg = top_10['Sales']。意思是

ax0.axvline(x=avg,color='b ',label='Average ',linestyle=' -',linewidth=1)

#对单位图重复上述步骤

top_10.plot(kind='barh ',y="Purchases ",x="Name ",ax=ax1)

avg = top_10['购买']。意思是

ax1.set(title='Units ',xlabel='Total Units ',ylabel= ' ')

ax1.axvline(x=avg,color='b ',label='Average ',linestyle=' -',linewidth=1)

#标题图

fig.suptitle('2014年销售分析',fontsize=14,font weight = ' bold ');

#隐藏传说

ax1.legend.set_visible(False)

ax0.legend.set_visible(False)

现在,我已经用% matplotlib online展示了jupyter笔记本中的许多图像。但是,在许多情况下,您需要以特定的格式保存图像,并将其与其他表示方法集成。

Matplotlib支持许多不同的文件保存格式。您可以使用fig . canvas . get _ supported _ filetypes来检查系统支持的文件格式:

fig . canvas . get _ supported _ filetypes

{'eps ':'封装的附言',

“jpeg”:“联合图像专家组”,

jpg ':'联合摄影专家组',

' pdf ':'可移植文档格式',

pgf ':'乳胶的PGF代码',

png ':'便携式网络图形',

ps ':'附言',

raw ':'原始RGBA位图',

rgba ':'原始RGBA位图',

svg ':'可缩放矢量图形',

svgz ':'可缩放矢量图形',

tif ':'标记图像文件格式',

tiff ':'标记图像文件格式' }

我们有fig对象,所以我们可以保存多种格式的图像:

fig.savefig('sales.png ',transparent=False,dpi=80,bbox_inches="tight ")

这个版本将图表保存为png文件,背景不透明。我还指定了dpi和bbox_inches="tight "来最小化多余的空白色。

结论

希望这种方法能帮助你理解如何更有效地使用Matplotlib进行日常数据分析。

转载请注明原文地址:https://juke.outofmemory.cn/read/613297.html

最新回复(0)