简介

python中matplotlib是非常重要并且方便的图形化工具,使用matplotlib可以可视化的进行数据分析,今天本文将会详细讲解Pandas中的matplotlib应用。

基础画图

要想使用matplotlib,我们需要引用它:

  1. In [1]: import matplotlib.pyplot as plt

假如我们要从2020年1月1日开始,随机生成365天的数据,然后作图表示应该这样写:

  1. ts = pd.Series(np.random.randn(365), index=pd.date_range("1/1/2020", periods=365))
  2. ts.plot()

使用DF可以同时画多个Series的图像:

  1. df3 = pd.DataFrame(np.random.randn(365, 4), index=ts.index, columns=list("ABCD"))
  2. df3= df3.cumsum()
  3. df3.plot()

可以指定行和列使用的数据:

  1. df3 = pd.DataFrame(np.random.randn(365, 2), columns=["B", "C"]).cumsum()
  2. df3["A"] = pd.Series(list(range(len(df))))
  3. df3.plot(x="A", y="B");

其他图像

plot() 支持很多图像类型,包括bar, hist, box, density, area, scatter, hexbin, pie等,下面我们分别举例子来看下怎么使用。

bar

  1. df.iloc[5].plot(kind="bar");

多个列的bar:

  1. df2 = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
  2. df2.plot.bar();

stacked bar

  1. df2.plot.bar(stacked=True);

barh

barh 表示横向的bar图:

  1. df2.plot.barh(stacked=True);

Histograms

  1. df2.plot.hist(alpha=0.5);

box

  1. df.plot.box();

box可以自定义颜色:

  1. color = {
  2. ....: "boxes": "DarkGreen",
  3. ....: "whiskers": "DarkOrange",
  4. ....: "medians": "DarkBlue",
  5. ....: "caps": "Gray",
  6. ....: }
  7. df.plot.box(color=color, sym="r+");

可以转成横向的:

  1. df.plot.box(vert=False);

除了box,还可以使用DataFrame.boxplot来画box图:

  1. In [42]: df = pd.DataFrame(np.random.rand(10, 5))
  2. In [44]: bp = df.boxplot()

boxplot可以使用by来进行分组:

  1. df = pd.DataFrame(np.random.rand(10, 2), columns=["Col1", "Col2"])
  2. df
  3. Out[90]:
  4. Col1 Col2
  5. 0 0.047633 0.150047
  6. 1 0.296385 0.212826
  7. 2 0.562141 0.136243
  8. 3 0.997786 0.224560
  9. 4 0.585457 0.178914
  10. 5 0.551201 0.867102
  11. 6 0.740142 0.003872
  12. 7 0.959130 0.581506
  13. 8 0.114489 0.534242
  14. 9 0.042882 0.314845
  15. df.boxplot()

现在给df加一列:

  1. df["X"] = pd.Series(["A", "A", "A", "A", "A", "B", "B", "B", "B", "B"])
  2. df
  3. Out[92]:
  4. Col1 Col2 X
  5. 0 0.047633 0.150047 A
  6. 1 0.296385 0.212826 A
  7. 2 0.562141 0.136243 A
  8. 3 0.997786 0.224560 A
  9. 4 0.585457 0.178914 A
  10. 5 0.551201 0.867102 B
  11. 6 0.740142 0.003872 B
  12. 7 0.959130 0.581506 B
  13. 8 0.114489 0.534242 B
  14. 9 0.042882 0.314845 B
  15. bp = df.boxplot(by="X")

Area

使用 Series.plot.area() 或者 DataFrame.plot.area() 可以画出area图。

  1. In [60]: df = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])
  2. In [61]: df.plot.area();

如果不想叠加,可以指定stacked=False

  1. In [62]: df.plot.area(stacked=False);

Scatter

DataFrame.plot.scatter() 可以创建点图。

  1. In [63]: df = pd.DataFrame(np.random.rand(50, 4), columns=["a", "b", "c", "d"])
  2. In [64]: df.plot.scatter(x="a", y="b");

scatter图还可以带第三个轴:

  1. df.plot.scatter(x="a", y="b", c="c", s=50);

可以将第三个参数变为散点的大小:

  1. df.plot.scatter(x="a", y="b", s=df["c"] * 200);

Hexagonal bin

使用 DataFrame.plot.hexbin() 可以创建蜂窝图:

  1. In [69]: df = pd.DataFrame(np.random.randn(1000, 2), columns=["a", "b"])
  2. In [70]: df["b"] = df["b"] + np.arange(1000)
  3. In [71]: df.plot.hexbin(x="a", y="b", gridsize=25);

默认情况下颜色深度表示的是(x,y)中元素的个数,可以通过reduce_C_function来指定不同的聚合方法:比如 mean, max, sum, std.

  1. In [72]: df = pd.DataFrame(np.random.randn(1000, 2), columns=["a", "b"])
  2. In [73]: df["b"] = df["b"] = df["b"] + np.arange(1000)
  3. In [74]: df["z"] = np.random.uniform(0, 3, 1000)
  4. In [75]: df.plot.hexbin(x="a", y="b", C="z", reduce_C_function=np.max, gridsize=25);

Pie

使用 DataFrame.plot.pie() 或者 Series.plot.pie()来构建饼图:

  1. In [76]: series = pd.Series(3 * np.random.rand(4), index=["a", "b", "c", "d"], name="series")
  2. In [77]: series.plot.pie(figsize=(6, 6));

可以按照列的个数分别作图:

  1. In [78]: df = pd.DataFrame(
  2. ....: 3 * np.random.rand(4, 2), index=["a", "b", "c", "d"], columns=["x", "y"]
  3. ....: )
  4. ....:
  5. In [79]: df.plot.pie(subplots=True, figsize=(8, 4));

更多定制化的内容:

  1. In [80]: series.plot.pie(
  2. ....: labels=["AA", "BB", "CC", "DD"],
  3. ....: colors=["r", "g", "b", "c"],
  4. ....: autopct="%.2f",
  5. ....: fontsize=20,
  6. ....: figsize=(6, 6),
  7. ....: );

如果传入的value值加起来不是1,那么会画出一个伞形:

  1. In [81]: series = pd.Series([0.1] * 4, index=["a", "b", "c", "d"], name="series2")
  2. In [82]: series.plot.pie(figsize=(6, 6));

在画图中处理NaN数据

下面是默认画图方式中处理NaN数据的方式:

画图方式 处理NaN的方式
Line Leave gaps at NaNs
Line (stacked) Fill 0’s
Bar Fill 0’s
Scatter Drop NaNs
Histogram Drop NaNs (column-wise)
Box Drop NaNs (column-wise)
Area Fill 0’s
KDE Drop NaNs (column-wise)
Hexbin Drop NaNs
Pie Fill 0’s

其他作图工具

散点矩阵图Scatter matrix

可以使用pandas.plotting中的scatter_matrix来画散点矩阵图:

  1. In [83]: from pandas.plotting import scatter_matrix
  2. In [84]: df = pd.DataFrame(np.random.randn(1000, 4), columns=["a", "b", "c", "d"])
  3. In [85]: scatter_matrix(df, alpha=0.2, figsize=(6, 6), diagonal="kde");

密度图Density plot

使用 Series.plot.kde() 和 DataFrame.plot.kde() 可以画出密度图:

  1. In [86]: ser = pd.Series(np.random.randn(1000))
  2. In [87]: ser.plot.kde();

安德鲁斯曲线Andrews curves

安德鲁斯曲线允许将多元数据绘制为大量曲线,这些曲线是使用样本的属性作为傅里叶级数的系数创建的. 通过为每个类对这些曲线进行不同的着色,可以可视化数据聚类。 属于同一类别的样本的曲线通常会更靠近在一起并形成较大的结构。

  1. In [88]: from pandas.plotting import andrews_curves
  2. In [89]: data = pd.read_csv("data/iris.data")
  3. In [90]: plt.figure();
  4. In [91]: andrews_curves(data, "Name");

平行坐标Parallel coordinates

平行坐标是一种用于绘制多元数据的绘制技术。 平行坐标允许人们查看数据中的聚类,并直观地估计其他统计信息。 使用平行坐标点表示为连接的线段。 每条垂直线代表一个属性。 一组连接的线段代表一个数据点。 趋于聚集的点将显得更靠近。

  1. In [92]: from pandas.plotting import parallel_coordinates
  2. In [93]: data = pd.read_csv("data/iris.data")
  3. In [94]: plt.figure();
  4. In [95]: parallel_coordinates(data, "Name");

滞后图lag plot

滞后图是用时间序列和相应的滞后阶数序列做出的散点图。可以用于观测自相关性。

  1. In [96]: from pandas.plotting import lag_plot
  2. In [97]: plt.figure();
  3. In [98]: spacing = np.linspace(-99 * np.pi, 99 * np.pi, num=1000)
  4. In [99]: data = pd.Series(0.1 * np.random.rand(1000) + 0.9 * np.sin(spacing))
  5. In [100]: lag_plot(data);

自相关图Autocorrelation plot

自相关图通常用于检查时间序列中的随机性。 自相关图是一个平面二维坐标悬垂线图。横坐标表示延迟阶数,纵坐标表示自相关系数。

  1. In [101]: from pandas.plotting import autocorrelation_plot
  2. In [102]: plt.figure();
  3. In [103]: spacing = np.linspace(-9 * np.pi, 9 * np.pi, num=1000)
  4. In [104]: data = pd.Series(0.7 * np.random.rand(1000) + 0.3 * np.sin(spacing))
  5. In [105]: autocorrelation_plot(data);

Bootstrap plot

bootstrap plot用于直观地评估统计数据的不确定性,例如均值,中位数,中间范围等。从数据集中选择指定大小的随机子集,为该子集计算出相关统计信息, 重复指定的次数。 生成的图和直方图构成了引导图。

  1. In [106]: from pandas.plotting import bootstrap_plot
  2. In [107]: data = pd.Series(np.random.rand(1000))
  3. In [108]: bootstrap_plot(data, size=50, samples=500, color="grey");

RadViz

他是基于弹簧张力最小化算法。它把数据集的特征映射成二维目标空间单位圆中的一个点,点的位置由系在点上的特征决定。把实例投入圆的中心,特征会朝圆中此实例位置(实例对应的归一化数值)“拉”实例。

  1. In [109]: from pandas.plotting import radviz
  2. In [110]: data = pd.read_csv("data/iris.data")
  3. In [111]: plt.figure();
  4. In [112]: radviz(data, "Name");

图像的格式

matplotlib 1.5版本之后,提供了很多默认的画图设置,可以通过matplotlib.style.use(my_plot_style)来进行设置。

可以通过使用matplotlib.style.available来列出所有可用的style类型:

  1. import matplotlib as plt;
  2. plt.style.available
  3. Out[128]:
  4. ['seaborn-dark',
  5. 'seaborn-darkgrid',
  6. 'seaborn-ticks',
  7. 'fivethirtyeight',
  8. 'seaborn-whitegrid',
  9. 'classic',
  10. '_classic_test',
  11. 'fast',
  12. 'seaborn-talk',
  13. 'seaborn-dark-palette',
  14. 'seaborn-bright',
  15. 'seaborn-pastel',
  16. 'grayscale',
  17. 'seaborn-notebook',
  18. 'ggplot',
  19. 'seaborn-colorblind',
  20. 'seaborn-muted',
  21. 'seaborn',
  22. 'Solarize_Light2',
  23. 'seaborn-paper',
  24. 'bmh',
  25. 'seaborn-white',
  26. 'dark_background',
  27. 'seaborn-poster',
  28. 'seaborn-deep']

去掉小图标

默认情况下画出来的图会有一个表示列类型的图标,可以使用legend=False禁用:

  1. In [115]: df = pd.DataFrame(np.random.randn(1000, 4), index=ts.index, columns=list("ABCD"))
  2. In [116]: df = df.cumsum()
  3. In [117]: df.plot(legend=False);

设置label的名字

  1. In [118]: df.plot();
  2. In [119]: df.plot(xlabel="new x", ylabel="new y");

缩放

画图中如果X轴或者Y轴的数据差异过大,可能会导致图像展示不友好,数值小的部分基本上无法展示,可以传入logy=True进行Y轴的缩放:

  1. In [120]: ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))
  2. In [121]: ts = np.exp(ts.cumsum())
  3. In [122]: ts.plot(logy=True);

多个Y轴

使用secondary_y=True 可以绘制多个Y轴数据:

  1. In [125]: plt.figure();
  2. In [126]: ax = df.plot(secondary_y=["A", "B"])
  3. In [127]: ax.set_ylabel("CD scale");
  4. In [128]: ax.right_ax.set_ylabel("AB scale");

小图标上面默认会添加right字样,想要去掉的话可以设置mark_right=False:

  1. In [129]: plt.figure();
  2. In [130]: df.plot(secondary_y=["A", "B"], mark_right=False);

坐标文字调整

使用时间做坐标的时候,因为时间太长,导致x轴的坐标值显示不完整,可以使用x_compat=True 来进行调整:

  1. In [133]: plt.figure();
  2. In [134]: df["A"].plot(x_compat=True);

如果有多个图像需要调整,可以使用with:

  1. In [135]: plt.figure();
  2. In [136]: with pd.plotting.plot_params.use("x_compat", True):
  3. .....: df["A"].plot(color="r")
  4. .....: df["B"].plot(color="g")
  5. .....: df["C"].plot(color="b")
  6. .....:

子图

绘制DF的时候,可以将多个Series分开作为子图显示:

  1. In [137]: df.plot(subplots=True, figsize=(6, 6));

可以修改子图的layout:

  1. df.plot(subplots=True, layout=(2, 3), figsize=(6, 6), sharex=False);

上面等价于:

  1. In [139]: df.plot(subplots=True, layout=(2, -1), figsize=(6, 6), sharex=False);

一个更复杂的例子:

  1. In [140]: fig, axes = plt.subplots(4, 4, figsize=(9, 9))
  2. In [141]: plt.subplots_adjust(wspace=0.5, hspace=0.5)
  3. In [142]: target1 = [axes[0][0], axes[1][1], axes[2][2], axes[3][3]]
  4. In [143]: target2 = [axes[3][0], axes[2][1], axes[1][2], axes[0][3]]
  5. In [144]: df.plot(subplots=True, ax=target1, legend=False, sharex=False, sharey=False);
  6. In [145]: (-df).plot(subplots=True, ax=target2, legend=False, sharex=False, sharey=False);

画表格

如果设置table=True , 可以直接将表格数据一并显示在图中:

  1. In [165]: fig, ax = plt.subplots(1, 1, figsize=(7, 6.5))
  2. In [166]: df = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"])
  3. In [167]: ax.xaxis.tick_top() # Display x-axis ticks on top.
  4. In [168]: df.plot(table=True, ax=ax)
  5. fig

table还可以显示在图片上面:

  1. In [172]: from pandas.plotting import table
  2. In [173]: fig, ax = plt.subplots(1, 1)
  3. In [174]: table(ax, np.round(df.describe(), 2), loc="upper right", colWidths=[0.2, 0.2, 0.2]);
  4. In [175]: df.plot(ax=ax, ylim=(0, 2), legend=None);

使用Colormaps

如果Y轴的数据太多的话,使用默认的线的颜色可能不好分辨。这种情况下可以传入colormap 。

  1. In [176]: df = pd.DataFrame(np.random.randn(1000, 10), index=ts.index)
  2. In [177]: df = df.cumsum()
  3. In [178]: plt.figure();
  4. In [179]: df.plot(colormap="cubehelix");

本文已收录于 http://www.flydean.com/09-python-pandas-plot/

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!

Pandas高级教程之:plot画图详解的更多相关文章

  1. Pandas高级教程之:GroupBy用法

    Pandas高级教程之:GroupBy用法 目录 简介 分割数据 多index get_group dropna groups属性 index的层级 group的遍历 聚合操作 通用聚合方法 同时使用 ...

  2. Pandas高级教程之:处理text数据

    目录 简介 创建text的DF String 的方法 columns的String操作 分割和替换String String的连接 使用 .str来index extract extractall c ...

  3. Pandas高级教程之:Dataframe的合并

    目录 简介 使用concat 使用append 使用merge 使用join 覆盖数据 简介 Pandas提供了很多合并Series和Dataframe的强大的功能,通过这些功能可以方便的进行数据分析 ...

  4. Pandas高级教程之:处理缺失数据

    目录 简介 NaN的例子 整数类型的缺失值 Datetimes 类型的缺失值 None 和 np.nan 的转换 缺失值的计算 使用fillna填充NaN数据 使用dropna删除包含NA的数据 插值 ...

  5. Pandas高级教程之:category数据类型

    目录 简介 创建category 使用Series创建 使用DF创建 创建控制 转换为原始类型 categories的操作 获取category的属性 重命名categories 使用add_cate ...

  6. Pandas高级教程之:统计方法

    目录 简介 变动百分百 Covariance协方差 Correlation相关系数 rank等级 简介 数据分析中经常会用到很多统计类的方法,本文将会介绍Pandas中使用到的统计方法. 变动百分百 ...

  7. Pandas高级教程之:window操作

    目录 简介 滚动窗口 Center window Weighted window 加权窗口 扩展窗口 指数加权窗口 简介 在数据统计中,经常需要进行一些范围操作,这些范围我们可以称之为一个window ...

  8. Pandas高级教程之:稀疏数据结构

    目录 简介 Spare data的例子 SparseArray SparseDtype Sparse的属性 Sparse的计算 SparseSeries 和 SparseDataFrame 简介 如果 ...

  9. Pandas高级教程之:自定义选项

    目录 简介 常用选项 get/set 选项 经常使用的选项 最大展示行数 超出数据展示 最大列的宽度 显示精度 零转换的门槛 列头的对齐方向 简介 pandas有一个option系统可以控制panda ...

随机推荐

  1. grub救援模式

    http://www.jinbuguo.com/linux/grub.cfg.html

  2. 有没有一种组合字体,中文是宋体,英文是times new roman?

    有没有一种组合字体,中文是宋体,英文是times new roman? 由于日常科研工作书写需要,想问问各位大神有没有一种字体,中文是宋体,西文是times new roman,这样写论文好方便啊有没 ...

  3. yum 命令详解-yum仓库配置文件详解

    yum安装的优点 1.必须得有网络,通过网络获取软件. 2.管理rpm包 3.自动解决依耐 4.命令简单好用 5.生产最佳实践 yum命令详解 # linux安装软件的三种方式 1.rpm安装 2.源 ...

  4. Scala 中 object、class 与 trait 的区别

    Scala 中 object.class 与 trait 的区别 引言 当你刚入门 Scala,肯定会迫不及待想要编写自己的第一个 Scala 程序.如果你已经在交互模式下敲过 Scala 代码,想必 ...

  5. TB6560步进电机驱动板

    极客工坊比较好的帖子: 关于驱动板的共阴极和共阳极接法 http://www.geek-workshop.com/thread-12695-1-1.html

  6. AD中如何解决 同一局域网下证书冲突问题

    AD中如何解决  同一局域网下证书冲突问题 https://wenku.baidu.com/view/c20e1720482fb4daa58d4b52.html

  7. 在Linux服务器,搭建K8s服务【脚本篇】

    前言 好久没有写博客了,本文主要是对网上文章的总结篇,主要是将安装和运行代码做了一次真机实验,亲测可用.文章内包含的脚本和代码,多来自于网络,也有我自己的调整和配置,文章末尾对参考的文献做了列举,方便 ...

  8. 贪心算法leetcode-763

    int[] lastShow = new int[26]; var list = new LinkedList<Integer>(); for (int i = 0; i < s.l ...

  9. 灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据

    灵动微电子ARM Cortex M0 MM32F0010 UART1和UART2中断接收数据 目录: 1.MM32F0010UART简介 2.MM32F0010UART特性 3.MM32F0010使用 ...

  10. python报错“AttributeError: 'set' object has no attribute 'items'“

    作为才开始学爬虫的萌新,遇到了一个这样的错,很懵逼 后面到网络到处查看大佬的解决方法,才发现headers的请求头部信息有错误,headers是一个字典,不是字符串,所以报错了 原代码 headers ...