创建一个优秀的可视化图表的关键在于引导读者,让他们能理解图表所讲述的故事。在一些情况下,这个故事可以通过纯图像的方式表达,不需要额外添加文字,但是在另外一些情况中,图表需要文字的提示和标签才能将故事讲好。也许标注最基本的类型就是图表的标签和标题,但是其中的选项参数却有很多。让我们在本节中使用一些数据来创建可视化图表并标注这些图表来表达这些有趣的信息。首先还是需要将要用到的模块和包导入pycharm:

import matplotlib.pyplot as plt

import matplotlib as mpl

plt.style.use('seaborn-whitegrid')

import numpy as np

import pandas as pd

例子:节假日对美国出生率的影响

我们先按照前面的方式进行同样的数据清洗程序,然后以图表展示这个结果:

births = pd.read_csv(r'd:\python\github学习材料\python数据科学手册\data\births.csv')

quartiles = np.percentile(births['births'], [25, 50, 75])

mu, sig = quartiles[1], 0.74 * (quartiles[2] - quartiles[0])

births = births.query('(births > @mu - 5 * @sig) & (births < @mu + 5 * @sig)')

births['day'] = births['day'].astype(int)

births.index = pd.to_datetime(10000 * births.year +

100 * births.month +

births.day, format='%y%m%d')

births_by_date = births.pivot_table('births',

[births.index.month, births.index.day])

births_by_date.index = [pd.datetime(2012, month, day)

for (month, day) in births_by_date.index]

fig, ax = plt.subplots(figsize=(12, 4))

births_by_date.plot(ax=ax);

当我们绘制了这样的图表来表达数据时,如果我们能对一些图表的特性作出标注来吸引读者的注意力通常是非常有帮助的。这可以通过调用plt.text或ax.text函数来实现,它们可以在某个特定的 x,y 轴位置输出一段文字:

fig, ax = plt.subplots(figsize=(12, 4))

births_by_date.plot(ax=ax)

# 在折线的特殊位置标注文字

style = dict(size=10, color='gray')

ax.text('2012-1-1', 3950, "new year's day", **style)

ax.text('2012-7-4', 4250, "independence day", ha='center', **style)

ax.text('2012-9-4', 4850, "labor day", ha='center', **style)

ax.text('2012-10-31', 4600, "halloween", ha='right', **style)

ax.text('2012-11-25', 4450, "thanksgiving", ha='center', **style)

ax.text('2012-12-25', 3850, "christmas ", ha='right', **style)

# 设置标题和y轴标签

ax.set(title='usa births by day of year (1969-1988)',

ylabel='average daily births')

# 设置x轴标签月份居中

ax.xaxis.set_major_locator(mpl.dates.monthlocator())

ax.xaxis.set_minor_locator(mpl.dates.monthlocator(bymonthday=15))

ax.xaxis.set_major_formatter(plt.nullformatter())

ax.xaxis.set_minor_formatter(mpl.dates.dateformatter('%h'));

ax.text方法接收 x 位置、y 位置、一个字符串和额外可选的关键字参数可以用来设置颜色、大小、样式、对齐等文本格式。上面我们使用了ha='right'和ha='center',这里的ha是*hirizonal alignment(水平对齐)*的缩写。要查阅更多的可用参数,请查看plt.text()和mpl.text.text()的文档字符串内容。

转换和文本位置

在刚才的例子中,我们将文字标注根据数据位置进行了定位。有些时候我们需要将文字标注独立于数据位置而根据图表位置进行定位。matplotlib 通过转换完成这项工作。

任何的图形显示框架都需要在坐标系统之间进行转换的机制。例如,一个数据点位于  被转换为图表中的某个位置,进而转换为屏幕上显示的像素。这样的坐标转换在数学上都相对来说比较直接,,而且 matplotlib 提供了一系列的工具实现了转换(这些工具可以在matplotlib.transforms模块中找到)。

一般来说,用户很少需要关注这些转换的细节,但是当考虑将文本在图表上展示时,这些知识却比较有用。在这种情况中,下面三种定义好的转换是比较有用的:

ax.transdata:与数据坐标相关的转换

ax.tranaxes:与 axes 尺寸相关的转换(单位是 axes 的宽和高)

ax.tranfigure:与 figure 尺寸相关的转换(单位是 figure 的宽和高)

下面我们来看看使用这些转换将文字写在图表中不同位置的例子:

fig, ax = plt.subplots(facecolor='lightgray')

ax.axis([0, 10, 0, 10])

# transform=ax.transdata是默认的,这里写出来是为了明确对比

ax.text(1, 5, ". data: (1, 5)", transform=ax.transdata)

ax.text(0.5, 0.1, ". axes: (0.5, 0.1)", transform=ax.transaxes)

ax.text(0.2, 0.2, ". figure: (0.2, 0.2)", transform=fig.transfigure);

注意默认情况下,文字是在指定坐标位置靠左对齐的:这里每个字符串开始的"."的位置就是每种转换的坐标位置。

transdata坐标给定的是通常使用的 x 和 y 轴坐标位置。transaxes坐标给定的是从 axes 左下角开始算起(白色区域)的坐标位置,使用的是宽度和长度的占比。transfigure坐标类似,给定的是从 figure 左下角开始算起(灰色区域)的坐标位置,使用的也是宽度和长度的占比。

因此如果我们改变了轴的最大长度,只有transdata坐标会收到影响,其他两个还是保持在相同位置:

ax.set_xlim(0, 2)

ax.set_ylim(-6, 6)

fig

这个变化可以通过动态改变轴的最大长度看的更加清楚:如果你在 notebook 执行这段代码,你可以将%matplotlib inline改为%matplotlib notebook,然后使用图表的菜单来交互式的改变图表。

箭头和标注

除了刻度标签和文字标签,另一种常用的标注是箭头。

在 matplotlib 中绘制箭头通常比你想象的难得多。虽然有plt.arrow()函数,作者不建议使用它:这个函数绘制的箭头是一个 svg 对象,因此在图表使用不同的比例的情况会产生问题,结果通常不能让用户满意。因此,作者建议使用plt.annotate()函数。这个函数会绘制一些文字以及一个箭头,并且箭头可以非常灵活的进行配置。

下面我们提供一些参数来使用annotate函数:

fig, ax = plt.subplots()

x = np.linspace(0, 20, 1000)

ax.plot(x, np.cos(x))

ax.axis('equal')

ax.annotate('local maximum', xy=(6.28, 1), xytext=(10, 4),

arrowprops=dict(facecolor='black', shrink=0.05))

ax.annotate('local minimum', xy=(5 * np.pi, -1), xytext=(2, -6),

arrowprops=dict(arrowstyle="->",

connectionstyle="angle3,anglea=0,angleb=-90"));

箭头的样式是使用箭头属性字典值进行控制的,里面有很多可用的参数。这些参数在 matplotlib 的在线文档中已经有了很详细的说明,因此在这里就不将这部分内容重复介绍一遍了。我们在前面出生率图上再使用一些参数进行更多的说明:

fig, ax = plt.subplots(figsize=(12, 4))

births_by_date.plot(ax=ax)

# 为图表添加标注

ax.annotate("new year's day", xy=('2012-1-1', 4100),  xycoords='data',

xytext=(50, -30), textcoords='offset points',

arrowprops=dict(arrowstyle="->",

connectionstyle="arc3,rad=-0.2"))

ax.annotate("independence day", xy=('2012-7-4', 4250),  xycoords='data',

bbox=dict(boxstyle="round", fc="none", ec="gray"),

xytext=(10, -40), textcoords='offset points', ha='center',

arrowprops=dict(arrowstyle="->"))

ax.annotate('labor day', xy=('2012-9-4', 4850), xycoords='data', ha='center',

xytext=(0, -20), textcoords='offset points')

ax.annotate('', xy=('2012-9-1', 4850), xytext=('2012-9-7', 4850),

xycoords='data', textcoords='data',

arrowprops={'arrowstyle': '|-|,widtha=0.2,widthb=0.2', })

ax.annotate('halloween', xy=('2012-10-31', 4600),  xycoords='data',

xytext=(-80, -40), textcoords='offset points',

arrowprops=dict(arrowstyle="fancy",

fc="0.6", ec="none",

connectionstyle="angle3,anglea=0,angleb=-90"))

ax.annotate('thanksgiving', xy=('2012-11-25', 4500),  xycoords='data',

xytext=(-120, -60), textcoords='offset points',

bbox=dict(boxstyle="round4,pad=.5", fc="0.9"),

arrowprops=dict(arrowstyle="->",

connectionstyle="angle,anglea=0,angleb=80,rad=20"))

ax.annotate('christmas', xy=('2012-12-25', 3850),  xycoords='data',

xytext=(-30, 0), textcoords='offset points',

size=13, ha='right', va="center",

bbox=dict(boxstyle="round", alpha=0.1),

arrowprops=dict(arrowstyle="wedge,tail_width=0.5", alpha=0.1));

# 设置图表标题和坐标轴标记

ax.set(title='usa births by day of year (1969-1988)',

ylabel='average daily births')

# 设置月份坐标居中显示

ax.xaxis.set_major_locator(mpl.dates.monthlocator())

ax.xaxis.set_minor_locator(mpl.dates.monthlocator(bymonthday=15))

ax.xaxis.set_major_formatter(plt.nullformatter())

ax.xaxis.set_minor_formatter(mpl.dates.dateformatter('%h'));

ax.set_ylim(3600, 5400);

上图中箭头和文字框都非常详尽了:可以看出你几乎可以使用plt.annotate创建任何你想要的箭头样式。不幸的是,这意味着这种特性都需要手工进行调整,因此如果需要获得印刷质量的图像,这将是一个非常耗费时间的工作。最后,必须指出,上述这种多种样式混合的方式来展现数据肯定不是最佳实践,这里只是为了尽可能多的介绍可用的参数。

更多关于 matplotlib 的箭头和标注样式的讨论和例子可以访问 matplotlib gallery。

以上就是python matplotlib基础--如何添加文本和标注的详细内容,更多关于python matplotlib添加文本和标注的资料请关注萬仟网其它相关文章!

希望与广大网友互动??

点此进行留言吧!

python可视化添加文本_python Matplotlib基础--如何添加文本和标注相关推荐

  1. Python可视化数据分析10、Matplotlib库

    Python可视化数据分析10.Matplotlib库

  2. python 可视化分析平台_python 数据分析数据可视化工具matplotlib

    说明: 数据可视化中的数据集下载地址:(数据来源:从零开始学python数据分析和挖掘) 链接:https://pan.baidu.com/s/1zrNpzSNVHd8v1rGFRzKipQ 提取码: ...

  3. python可视化库总结_Python 可视化库 - Matplotlib 使用总结

    Python 可视化库 - Matplotlib 使用总结 在做完数据分析后, 有时候需要将分析结果一目了然地展示出来, 此时便离不开 Python 可视化工具, Matplotlib 是 Pytho ...

  4. python画点连线_python matplotlib 在指定的两个点之间连线方法

    python matplotlib 在指定的两个点之间连线方法 为了找到matplotlib在两个点之间连线的方法真是费了好大功夫,最后还是决定用简单的 plt.plot 来解决.如果有好多对点,则可 ...

  5. python和对象复习_python 面向对象基础和高级复习

    面向对象基础 面向对象编程 面向过程编程:类似于工厂的流水线 优点:逻辑清晰 缺点:扩展性差 面向对象编程:核心是对象二字,对象属性和方法的集合体,面向对象编程就是一堆对象交互 优点:扩展性强 缺点: ...

  6. python可视化窗口库_Python可视化工具介绍——找到合适的库

    Python有很多可视化工具,大体上可以分为基于matplotlib的工具库和基于JS的工具库. 有如此丰富的选择是幸福的,无论你要画什么图,都能找到相对的库.但与此同时,弄清楚使用哪个工具更合适可能 ...

  7. python数据分析怎么画_Python数据分析基础(九) 使用Seaborn绘制图像

    Seaborn是基于matplotlib的Python可视化库.它提供了一个高级界面来绘制有吸引力的统计图形.可以使得数据可视化更加的方便,美观.关于Seaborn的学习,推荐去官网,里边有详细的教程 ...

  8. python入门基本笔记_Python入门基础知识笔记

    点击蓝字"python教程"关注我们哟! 冯诺依曼架构 控制器 运算器 存储器 输入设备 (I) 输出设备 (O) CPU--控制器,运算器 # 运算器只与内存交换数据 内存--存 ...

  9. python列表增加行_python怎么在数组添加一行?

    python中在数组添加一行的方法: python中可以使用stack()函数在数组中添加一行,使用stack()函数需要导入numpy库. 函数原型为:stack(arrays, axis=0),a ...

最新文章

  1. 八、H.264中的熵编码基本方法、指数哥伦布编码
  2. python怎么学最快-人工智能Python开发怎么学才能最快入门
  3. shiro学习(12)No WebApplicationContext found:
  4. 关于面向对象以及三大特征的解释
  5. html中鼠标左键自定义多级菜单,CSS多级菜单的实现代码
  6. python元组和集合的区别_python 元组与list的区别
  7. iOS开发隐藏tabBar的问题
  8. 计算机系统-电路设计08-T触发器内部电路实现
  9. 真心干货:一起学习阿里巴巴数据中台实践!首次公开!
  10. python3.8安装matplotlib_图文详解python之matplotlib安装与报错解决办法
  11. docucentre s2011默认登录密码
  12. 线上数据库增加字段导致服务请求超时总结
  13. 关于limn阶乘/n^n的若干解法(2)
  14. C# VB .NET生成条形码,支持多种格式类型
  15. 日语常用会话1000句
  16. Jikes 研究虚拟机(RVM)二 JVM 的组织
  17. adb命令——简单常用命令介绍:将文件从手机上传输到电脑里:adb pull /sdcard/123.png c:\users\del\desktop...
  18. 一个关于springboot的junit使用错误,空指针异常
  19. 数学计算机游戏攻略,孩子们的游戏学习基本的数学
  20. vFlat Scan – 可能是最快捷的纸质书扫描应用,一次 2页,居然还能移除手指头[iOS/Android]

热门文章

  1. 在 SAP BTP 平台 Neo 环境里使用 SAP Cloud SDK 创建应用
  2. SAP Spartacus 在 CSR 模式下启用 SEO HTML tag 的临时方法
  3. SAP Fiori Elements 应用的 i18n 语法使用方式
  4. ABAP function module 的使用
  5. Angular router-outlet占位符层级结构的子节点,运行时是如何插入的
  6. Spring里的容器和Bean对象
  7. SAP UI5和angular里的常量定义
  8. how is sales pipeline retrieved from backend
  9. the code place where the binding is converted to final value displayed in u
  10. SAP UI5 main page design