matplotlib多纵轴_文科生学 Python 系列 13: matplotlib 绘图/条形图

第七课 - 数据可视化

本课内容:

matplotlib 绘图基础
函数曲线的绘制
图形细节的设置 案例分析:销售记录可视化
条形图
绘制多图
饼图
散点图
直方图 seaborn 数据可视化包
分类数据的散点图
分类数据的箱线图
多变量图

回顾:在之前课程中, 我们已经接触到了数据可视化

在第五节课中,我们通过 pandas 的 plot 函数对莺尾花数据进行了可视化。我们绘制了根据品种分类的散点图和箱线图。
在第六节课中,我们使用 matplotlib 绘制了姓名变化趋势图,并通过 plt 的各种选项对图形进行了美化。

上述例子中可视化都是基于 matplotlib 来展开的,在本次课程中我们将详细演示如何使用matplotlib

matplotlib 是 Python 编程语言的一个绘图库,最初由 John D. Hunter 撰写。
与 Python 的深度集成
风格与 Matlab 接近
官网: http:// matplotlib.org/

682994f7702837826f27115934e011e5.png
matplotlib 例图

老师说,我们为什么今天要上新的 matplotlib 的绘图呢,因为之前学的鸢尾花散点图用的是 Pandas 里面自带的 plot 图,在分类数据的分析上,之前学的方法显得冗余了。为了更好的可视化,不冗余!我们来学新的!

matplotlib 绘图基础

69f5ddd1b21c70dd6c3ddde4cc1e5782.png
导入数据包,设置基础

以上还是一样设置基础数据,每一次都要导入的 numpy 和 pandas 包,不导入后面会跟你说没有定义,识别不了的哦~ 设置图形的格式是 retina 的清晰度。运行之后,我们来正式绘图吧!

在matplotlib 中,绘制一个曲线图,可以使用 plt.plot 这个函数,在正弦函数中,主要的是 x 和 y 轴两个轴的数据。所以我们需要先设置 x 和 y 。

我们用 numpy 中的 arange 函数,设置的是从 0 到 5,间隔为 0.1 之间的数据。专业点来讲, 0.1 好像叫步长。当时上课这个语句一晃而过,我没看懂是什么为什么括号里面有三个数字,回放听终于明白了。。。明明是学过的啊

ede9042e8c12358ef793192d73f2b55e.png
x, y=sin(x)

突然觉得,中学时代不会 Python 真可惜,或许时不时用它来解决数学问题,数学成绩就没那么差了。周三上课的时候余老师一讲到正弦函数我就有点头大,幸好不是要我计算呀!

08057d89279d6d8be385a925338b2b25.png
plt.plot(x,y)

看到这里才发现,x 和 y 用的都是 np 的函数,在 np 里面定义赋值。为什么不是 pandas 呢?

老师说因为我们前面设置过自动显示图片(终于明白第一张图的 “%matplotlib Inline” 的作用了。。。),所以这里直接输入语句,按输出,就可以看到结果了。我们也可以设置成手动显示图片,看下图:

155fdb3539f553c43612c0b96bef8ab5.png
手动显示图片

plt.show( ) 这个语句,设置手动显示图片,而且这里没有 OUT 这个显示了。其实这个我不知道有什么用。

接下来又是(我不懂的)美化啦!

024020d9d58b3edbfd645094b6e86259.png
增加 color='g',marker='.',linewidth=2

把函数线的颜色设置成绿色,上课的时候我说为什么它知道 g 就是绿色啊!老师说用的 green 比 grey 多,所以系统会默认 g 是 green。上课讲的时候可没有 color=g 啊,老师用的是简写,直接在 plt.plot(x,y) 中的右边括号里面加上逗号和 'g . -' ,然后就是绿色➕点线条了。

现在看到的图两轴还是有些是空白,所以需要美化,缩减空白,这里用的是我们第六课用的方法:

9703f5517787e64e6d768e736a733e1a.png
xlim,.ylim

plt.xlim(0,5) 和 plt.ylim(-1.1,1.1) 的使用可以让区间空白改变一点,这次老师教了一种新的方法:

91d7923ca23f652199225438154e7186.png
plt.axis([0,5,-1.1,1.1])

plt.axis([0,5,-1.1,1.1]) ,和上节课的 xlim, ylim 使用结果一样,这个语句更短,先定义 x 轴的范围从 0 到 5,再定义 y 轴的范围,所以在圆括号里面,有一个方括号,包着四个数字,分别表示两个轴的范围。

要是我们需要清晰看到一个点所在的横纵坐标,需要用网格线进行更精确的定位,在那个点标明文字:

4a2fc6988934a8f58d13715bed449f35.png
plt.grid(True)

plt.grid(True) 指的是网格线存在哦。

plt.text(3.1,0.3,'sin(x)') ,指的是在坐标(3.1,0.3)的位置上加上文字说明 sin(x)。

回顾例一,用 plot 函数得到一个基本的曲线函数,然后用各种细节设置,让整个图变得更加饱满,包括标题/横轴/纵轴/网格/文本等设置,这样的方法称为函数式的编程,这是模仿 matlib 的作图方式。与之相对应的还有面向对象的作图,它对细节的控制会更加丰富,但对初学者的掌握能力来说,学会函数式的编程比较适时。

例2:绘制 y=x, y=x^2, y=x^3 三个函数的曲线

198bc75112cdf1c164e0fb0e789207bf.png
y=x, y=x^2, y=x^3

我在看预习资料的时候,看不到运行出来的图,plt.plot(x,x,x,x**2,x,x**3) ,这一句看起来太复杂有点可怕,然而它的意思竟然是,里面的 6 个数字分为三对 xy 轴的数。三个函数的 x 和 y 竟然可以全部挤在一起,厉害了。

要是想要更好的区分这三个函数曲线,可以用一些设置将它们变得更有辨识度:

c6c259adc9d917a8b22f0da7e6b30571.png
plt.plot(x,x,'r--',x,x**2,'bs',x,x**3,'g^')

上课看老师运行这一步的时候,惊呆了。这里就是上面提到过的简写了,具体代表什么,# 后面已经说明了。接下来还是继续美化显示的图片了,大家可以自己做一下啦!这里不展示了。

小结:

上述代码展示了matplotlib 的一些基本功能,我们可以通过使用 plt 自带的各种函数来控制图形的细节,比如是否加网格,坐标的标签等等。
我们在后续课程中还会向大家展示其他常用图形

案例分析:销售记录可视化

导入并观察数据

每次看到数据导入我就特别害怕,因为每次都会卡我很久,久到我会想“要不这文章就这样吧,老子不写了。” 每一次的坑我都记得非常清楚,红酒质量的,鸢尾花的,全美婴儿姓名的,这次是销售数据。

这次卡了多久?

一小时 30 分钟。

读取数据失败的我,拿起等了我 3 个小时三明治,一边吃一边苦闷地想,这样的事情真是太丢人了啊,同一个坑,掉第四次。吃完这次终于上网查怎么在 jupyter 导入 excel 数据了(以前我都在干嘛?!)但是并没有查到要的答案,终于在我们课程的讨论区,看到一个同学回复的答案!老泪纵横!!!

0a839cc8f7f09123ed188db82558670a.png
怎么导入数据到 jupyter

试了一下,上载成功的文件在 jupyter 打开是一片空白,而且把这个空白的文件下载到电脑了,我以为操作出了问题,试了几次,一模一样。把代码敲进去试着运行,竟然!成功运行了。。。诡异!

f995c51815ea2f0f0a71267b2152c8b9.png
读取 excel 数据文件

这是一份一家公司在某个时间段段交易数据。行首对应的分别是客户账号/公司名称/商品货号/每次交易的购货量/每个商品的交易价格/交易总额/交易时间。

要是你是一个数据分析师,想要在这份数据里面得到一些信息,你会从哪方面着手呢?

我们可以用之前学过的一些函数进行对整份数据进行分析:

01a559c0bcbce5411a594bfdca2999ca.png
df.info()

这是一份有 1500 条信息的数据,没有缺失值。

8f693cf7cc128deddb91dcf90fc34608.png
查看与之交易的公司数量

要是需要看与之交易的公司有哪些,可以把上面运行语句的 len( ) 去除掉。

要是需要看某家公司的交易量,也是可以用函数进行输出的:

b3360e76ce15474382b01db966a085b4.png
Barton LLC交易量(1)

88a585e771e1a879978bb2e3e93f23a5.png
Barton LLC交易量(2)

这个输出比较长,分两张展示首尾,最后一行可以看出,一共 82 笔交易。

销售额最高的 10 个公司

cc7e50ec06de29c4a25b9e9d1d5a9ca9.png
交易总额和交易次数的输出

先用语句求出我们要的数。套路都是我们之前学过的:用 groupby 分组,也就是找到交易量的公司,先圈出范围“name”,然后是“ext price” 。然后使用 agg 进行聚合运算:sum 求交易总额,count 计算交易次数。

但是在上面我们可以看到,行首的格式不是很对,这里需要调整一下:

4afdf7851e376dd5caf2f3501dd5ae3e.png
reset_index 重置索引

这里在前面一行加了 ' '这样的符号,老师说这样加上去可以让它换行,看了结果,应该是让name 这个词在行首回到了好看的位置。reset_index 重置索引,里面写的 “在这里取消了name 作为索引”,我没理解明白,也就是前面是用 name 来索引的?用 name 来索引和这一步的操作,作为索引来说,有什么不同?

这时候我们已经得到销售总额的数据了,但是我们的题目是需要销售总额前十的,所以我们需要对销售总额进行排序。

05201945823f4e126789425e7154815b.png
sort_values 进行排序

这里学到一个新的函数了,用 sort_values 进行排序。

好吧,前十还没出来:

d557b89a6b8f41240d1e64c36698be87.png
top10

这一步加了挺多东西上去的。重新再句首赋值 top10,后面输出 top10。在第 27 条输出了排前的销售额,才能直接在这一步的第二行代码最后直接使用切片的方式 [:10] 来运算。

然后是对行首名称对修改,把首字母都大写了,替换的方式是使用字典的键值对,格式是 {之前的值:替换上的值} ,老师运行的第一遍没有加上 inplace=true,结果就是并没有修改成功,然后解释,因为 rename 那一行算是里面默认的副本,要是没有 inplace=true ,那是运行不成功的。

我们总算把销售额前十的公司输出来了!

条形图

top10 公司销售总额的条形图

24d71d9585d119df13ae0666f10826de.png
plt.barh(np.arange(10),top10.Sales,height=0.5)

新的图!之前我们学过有 scatter 散点图,plot 折线图,还有啥来着?今天的直方图是 bar,哦,垂直的是 bar,水平方向的直方图是 barh。

所有的代码,其实都能看懂。但是要我自己不偷看打出来,真的是。。。心虚。

添加标题和横纵坐标的说明。并且,为了让图看起来更加知道相对应的值是什么,我们修改了坐标的刻度:

269615df31303ff190bcbd60583264ca.png
plt.yticks(np.arange(10),top10.Name)

觉得单看这个图好专业啊!这时候余老师讲了上课的第二个“冗余”,就是图和代码之间那串黑体字。这时候终于能够确切理解 冗余 这个词的表达力!要是不想看到这些多余的字,我们可以这样做:

aceb09cc74262c2dc0a816b3049523dc.png
plt.show()

有一种,把多余的毛发剃掉的感觉一样啊!!!!!清爽!

然饿,老师这时候又去改 X 轴坐标了:

dd21f5fc3cbed0ab8ddf8b89a270bd4e.png
plt.xticks

其实这一段不是很明白,替换掉的值,不像上面用字典来替换,用的是两个列表,后面一个列表里面的元素还是字符串。这是我们之前学过的??疑惑。

这个图的风格是默认的风格,老师说可以让我们尝试一下其他风格,选择之前看看有哪些是可以被选择的。这样的东西竟然都有语法,太可怕了!!!

17542f4b91a99d5f943b9c027b73fb21.png
plt.style.available

然后老师选了 ggplot,据说是 “爱原冢(音译)”的风格,来看看吧

5b7c8296a21c97e377038807715f18b4.png
plt.style.use('ggplot')

默认颜色变了,而且还有底版了:浅灰色+网格。

作业 7-1:

模仿上面的例子,画出交易总数最高的 10 个公司的条形图。
提示:可以使用 sort_values(by= quantity) 来实现。

啊啊啊,血槽空了,我去补补血,剩下这两天尽快更新!

文科生学Python系列13: matplotlib绘图/条形图​www.jianshu.com
58961fb2b671857d2fec7e1743cc2414.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值