在加载了,在加载了

【学习笔记】 第9章 绘图和可视化

前言

本篇学习matplotlib,一个创建出版质量图表的桌面绘图包,其目的是为Python构建一个MATLAB式的绘图接口。
说人话就是,可以把你的数据可视化

matplotlib API入门

matplotlib的通常引入约定是:
import matplotlib.pyplot as plt

  • 问题
    使用Matplotlib,这是
In [1]: import matplotlib.pyplot as plt
In [2]: import numpy as np
In [3]: data = np.arange(10)
In [4]: plt.plot(data)

我在ipython中得到的输出只有
Out[4]: [<matplotlib.lines.Line2D at 0x2c8c70acd90>]
并没有弹出图片
经过百度,得知在默认配置中,需要告诉matplotlib进行渲染,需要
plt.show()
才能看到图片
与此同时还得知如果需要保存图片可以使用plt.savefig('图片名字.格式')来存储

Figure和Subplot

matplotlib的图像都位于Figure对象中。你可以用plt.figure创建一个新的Figure:
In [16]: fig = plt.figure()其实可以理解为新建了一张画布
而且不能通过空Figure绘图。必须用add_subplot创建一个或多个subplot才行
In [17]: ax1 = fig.add_subplot(2, 2, 1)
这句的意思是,我可以创建一个2*2的图象数母,最后一个传入的1指的是当前选中的是4个subplot中的第一个

fig = plt.figure()
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 3)

执行如上命令,matplotlib就会在最后一个用过的subplot(如果没有则创建一个)上进行绘制,隐藏创建figure和subplot的过程
例如plt.plot(np.random.randn(50).cumsum(), 'k--')
这里代码解释是:使用randn功能产生标准正态分布的随机数50个,并用cumsum计算累加和,而"k--"是一个线型选项,用于告诉matplotlib绘制黑色虚线图。
图9-3 绘制一次之后的图像
由于上传图像有点麻烦,就用书中的图了

而plt.subplots,它可以创建一个新的Figure,并返回一个含有已创建的subplot对象的NumPy数组
fig, axes = plt.subplots(2, 3)这里会产生2*3个画布
表9-1 pyplot.subplots的选项

调整subplot周围的间距

利用Figure的subplots_adjust方法可以轻而易举地修改间距
plt.subplots_adjust(wspace=0, hspace=0)
这里会把行间距和列间距均变为0

颜色、标记和线型

常用的颜色可以使用颜色缩写,也可以指定颜色码,可以通过查看plot的文档字符串查看所有线型的合集。
线图可以使用标记强调数据点。因为matplotlib可以创建连续线图,在点之间进行插值,因此有时可能不太容易看出真实数据点的位置。标记也可以放到格式字符串中,但标记类型和线型必须放在颜色后面
marker='o'可以让数值处的点更明显
drawstyle='steps-post'图片不再是以线性插值

设置标题、轴标签、刻度以及刻度标签

要改变x轴刻度,最简单的办法是使用set_xticks和set_xticklabels。前者告诉matplotlib要将刻度放在数据范围中的哪些位置,默认情况下,这些位置也就是刻度标签。但我们可以通过set_xticklabels将任何其他的值用作标签

set_xticks([0, 250, 500, 750, 1000])

set_xticklabels(['one', 'two', 'three', 'four', 'five'],
                         rotation=30, fontsize='small')

rotation代表间距
Y轴的修改方式与此类似,只需将上述代码中的x替换为y即可。

添加图例

图例(legend)是另一种用于标识图表元素的重要工具。添加图例的方式有多种。最简单的是在添加subplot的时候传入label参数
ax.plot(randn(1000).cumsum(), 'k', label='one')

注解以及在Subplot上绘图

ax.annotate方法可以在指定的x和y坐标轴绘制标签。
ax.set_title添加图标标题

from datetime import datetime

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

data = pd.read_csv('examples/spx.csv', index_col=0, parse_dates=True)
spx = data['SPX']

spx.plot(ax=ax, style='k-')

crisis_data = [
    (datetime(2007, 10, 11), 'Peak of bull market'),
    (datetime(2008, 3, 12), 'Bear Stearns Fails'),
    (datetime(2008, 9, 15), 'Lehman Bankruptcy')
]

for date, label in crisis_data:
    ax.annotate(label, xy=(date, spx.asof(date) + 75),
                xytext=(date, spx.asof(date) + 225),
                arrowprops=dict(facecolor='black', headwidth=4, width=2,
                                headlength=4),
                horizontalalignment='left', verticalalignment='top')

# Zoom in on 2007-2010
ax.set_xlim(['1/1/2007', '1/1/2011'])
ax.set_ylim([600, 1800])

ax.set_title('Important dates in the 2008-2009 financial crisis')

将图表保存到文件

表9-2 Figure.savefig的选项

使用pandas和seaborn绘图

matplotlib实际上是一种比较低级的工具。要绘制一张图表,组装一些基本组件就行:数据展示(即图表类型:线型图、柱状图、盒形图、散布图、等值线图等)、图例、标题、刻度标签以及其他注解型信息。
在pandas中,我们有多列数据,还有行和列标签。pandas自身就有内置的方法,用于简化从DataFrame和Series绘制图形。另一个库seaborn(https://seaborn.pydata.org/),由Michael Waskom创建的静态图形库。Seaborn简化了许多常见可视类型的创建。

线型图

Series和DataFrame都有一个用于生成各类图表的plot方法。默认情况下,它们所生成的是线型图
plot参数的完整列表请参见表

DataFrame的plot方法会在一个subplot中为各列绘制一条线,并自动创建图例
表9-4 专用于DataFrame的plot参数

柱状图

plot.bar()和plot.barh()分别绘制水平和垂直的柱状图。这时,Series和DataFrame的索引将会被用作X(bar)或Y(barh)刻度

直方图和密度图

直方图(histogram)是一种可以对值频率进行离散化显示的柱状图。数据点被拆分到离散的、间隔均匀的面元中,绘制的是各面元中数据点的数量。通过在Series使用plot.hist方法,我们可以生成一张直方图
与此相关的一种图表类型是密度图,它是通过计算“可能会产生观测数据的连续概率分布的估计”而产生的。一般的过程是将该分布近似为一组核(即诸如正态分布之类的较为简单的分布)。因此,密度图也被称作KDE(Kernel Density Estimate,核密度估计)图。使用plot.kde和标准混合正态分布估计即可生成一张密度图
tips['tip_pct'].plot.hist(bins=50)
tips['tip_pct'].plot.density()

小结

还有很多关于绘图的细节,时间原因没有一一细看,具体需要学习的时候再反过头来阅读吧

pandas的大部分绘图方法都有一个可选的ax参数,它可以是一个matplotlib的subplot对象。这使你能够在网格布局中更为灵活地处理subplot的位置

posted @ 2022-03-17 12:28  Lugendary  阅读(127)  评论(0编辑  收藏  举报