介绍
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进行日常数据分析。