9.《Python数据分析》绘图和可视化

本章主要围绕matplotlib和seaborn两个模块进行可视化的演示

1 matplotlib API入门

matplotlib的图像都是基于Figure对象

  • plt.figure()可以创建一个空白的新Figure
  • 通过Figure对象的属性实现对图片的调整(比如figsize控制图片大小)
  • Figure对象可以通过add_subplot创建多子图,并可以依次进行绘制
  • 直接调用绘图函数时,Figure对象等创建过程会在内部自动进行

代码示例:

import matplotlib.pyplot as plt

plt.plot(np.arange(10)) # 绘制最简单的线图
fig = plt.figure() 
ax1 = fig.add_subplot(2, 2, 1) # 绘制2x2的多子图,初始化第一张
ax2 = fig.add_subplot(2, 2, 2) # add_subplot返回一个AxesSubplot对象
ax3 = fig.add_subplot(2, 2, 3) # AxesSubplot对象可以调用绘图方法进行绘制
# 第3张图:普通折线图(默认在最后一个AxesSubplot对象上绘制)
plt.plot(np.random.randn(50).cumsum(), 'k--') # k--表示黑色虚线
# 第1张图:普通直方图(bins指定桶数)
ax1.hist(np.random.randn(100), bins=20, color='k', alpha=0.3) # alpha指定透明度
# 第2张图:普通散点图(需要输入两列长度相同的数组)
ax2.scatter(np.arange(30), np.arange(30) + 3 * np.random.randn(30))

# 补充方法:一次性创建2x3的多子图画布
fig, axes = plt.subplots(2, 3, figsize=(8, 6)) # 指定图片尺寸为8x6
axes[0,1] # 表示第1行第2列对应的AxesSubplot对象

绘图结果示例:

在Jupyter Notebook中使用matplotlib时,可以通过%matplotlib inline命令设定绘制的图内嵌在页面里(默认是弹出一个图片窗口);其次还需要注意将针对同一个图的绘图命令放在单个单元格中(因为在运行每个单元格后,绘图相关的内容将被重置)

matplotlib的完整图像类型可参阅matplotlib官方绘图示例

其他绘图技巧:

  • subplots方法通过参数sharexsharey指定不同subplot共享相同的X轴或Y轴
  • subplots_adjust方法可以调整不同subplot之间的(高/宽)间距
  • 绘制图时可以通过参数linestylecolor等来控制绘图样式;参数drawstyle可以用来设置插值;多次绘图时可以通过参数label来进行区分(此参数一般会配合图例 legend 使用);
  • 绘制图时可以通过方法legend来启动图例,参数loc可以控制图例位置
  • 绘制图时可以通过方法xlim来控制X轴范围,set_xlabel方法可以设置X轴名称;set_title方法可以设置绘图名称;xticks方法和xticklabels方法(参数rotation可以设置标签倾斜度,很实用)可以分别来控制X轴刻度值和刻度标签;以上方法通用适用于Y轴
  • 绘制图时可以通过方法textarrowannotate来添加注解,参数familyfontsize等来控制字体样式;
  • 绘制结果可以通过方法savefig进行保存,该方法会根据后缀名自动推断保存格式,也可以通过参数format手动指定格式;参数dpi用于指定保存图片的分辨率
  • 绘图的配置信息会以字典的形式存储于plt.rc中,可调用plt.rcdefaults方法进行重置

代码示例:标准普尔500指数价格趋势与重要事件

from datetime import datetime

fig, ax = plt.subplots()

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

spx.plot(ax=ax, color="black")

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")

绘图结果示例:

2 使用pandas和seaborn绘图

在pandas中,Series和DataFrame都内置了一个用于生成各类图表的plot方法

  • plot方法默认绘制折线图,也可以通过参数kind指定其他绘图类型(比如面积图area,柱状图bar,横向柱状图barh,密度图density,直方图hist,核密度估计图kde,折线图line,饼图pie
  • plot方法可以通过参数ax接收matplotlib的AxesSubplot对象,也支持相应的绘图属性(比如alphafigsizetitlexlimlegendsharex等);通过参数rot旋转刻度标签;通过参数grid生成带网格的图像
  • plot方法默认使用行索引作为横轴,可以通过参数use_index修改

代码示例:pandas绘制多个折线图

df = pd.DataFrame(np.random.standard_normal((10, 4)).cumsum(0),
                   columns=["A", "B", "C", "D"],
                   index=np.arange(0, 100, 10))

plt.style.use('grayscale') # 修改绘图风格(灰度图,适配黑白打印的场景)
df.plot()

绘图结果示例:

在绘制柱状图时,可以通过参数stacked=True绘制堆叠柱状图;也可以通过.value_counts().plot.bar()绘制占比柱状图

seaborn是一个构建在matplotlib上的高级图形库,实现了更高效的可视化

关于seaborn的更多用法可参阅个人笔记-seaborn快速入门官方绘图示例

3 其他Python可视化工具

静态绘图还是推荐本章提到的matplotlib或seaborn

交互式绘图可考虑 AltairBokeh, Plotly

最后推荐另一本关于可视化的在线书籍《Fundamentals of Data Visualization》

作者最后推荐的书籍是基于R语言及ggplot绘制的,但是书中内容几乎不涉及R语言代码,而是围绕“通用的数据可视化技巧及其美学设计”展开,具体内容还没来得及品鉴~ #待补充

往年同期文章