数据科学 IPython 笔记本 8.4 简单的折线图

8.4 简单的折线图

原文:Simple Line Plots

译者:飞龙

协议:CC BY-NC-SA 4.0

本节是《Python 数据科学手册》(Python Data Science Handbook)的摘录。

也许最简单的绘图是单个函数y = f(x)的可视化。在这里,我们将首先看一下这种类型的简单绘图。与以下所有部分一样,我们首先为绘图配置笔记本,并导入我们将使用的包:

%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use('seaborn-whitegrid')
import numpy as np

对于所有 Matplotlib 绘图,我们首先创建一个图形和一个轴域。在最简单的形式中,可以按如下方式创建图形和轴域:

fig = plt.figure()
ax = plt.axes()
png

在Matplotlib中,图形(plt.Figure类的实例)可以视为单个容器,包含代表轴域,图形,文本和标签的所有对象。轴域(plt.Axes类的实例)就是我们在上面看到的:带有刻度和标签的边界框,它最终将包含构成我们可视化的绘图元素。在本书中,我们通常使用变量名fig来引用图形实例,而ax来引用一个或一组轴域实例。

一旦我们创建了轴域,我们就可以使用ax.plot函数来绘制一些数据。 让我们从一个简单的正弦曲线开始:

fig = plt.figure()
ax = plt.axes()

x = np.linspace(0, 10, 1000)
ax.plot(x, np.sin(x));
png

或者,我们可以使用pylab接口,让我们在后台创建图形和轴域
(参见“一个功能的两个接口”,那里讨论了这两个接口):

plt.plot(x, np.sin(x));
png

如果我们想要创建一个包含多条直线的单个图形,我们可以简单地多次调用plot函数:

plt.plot(x, np.sin(x))
plt.plot(x, np.cos(x));
png

这就是在 Matplotlib 中绘制简单函数的全部内容!我们现在将深入探讨,如何控制轴域和线条的外观的更多细节。

调整绘图:线条颜色和样式

你可能希望对绘图进行的第一个调整,是控制线条颜色和样式。plt.plot()函数接受可用于指定这些的其他参数。要调整颜色,可以使用color关键字,该关键字接受字符串参数,表示几乎任何可以想象的颜色。颜色可以通过多种方式指定:

plt.plot(x, np.sin(x - 0), color='blue')        # 根据名称指定颜色
plt.plot(x, np.sin(x - 1), color='g')           # 短颜色代码(rgbcmyk)
plt.plot(x, np.sin(x - 2), color='0.75')        # 0~1 的灰度
plt.plot(x, np.sin(x - 3), color='#FFDD44')     # 十六进制代码(00~FF 的 RRGGBB)
plt.plot(x, np.sin(x - 4), color=(1.0,0.2,0.3)) # RGB 元组,值为 0~1
plt.plot(x, np.sin(x - 5), color='chartreuse'); # 支持所有 HTML 颜色名
png

如果未指定颜色,Matplotlib 将自动遍历一组默认颜色,来显示多个线条。

同样,可以使用linestyle关键字调整线条样式:

plt.plot(x, x + 0, linestyle='solid')
plt.plot(x, x + 1, linestyle='dashed')
plt.plot(x, x + 2, linestyle='dashdot')
plt.plot(x, x + 3, linestyle='dotted');

# 简短起见,你可以使用下面的代码
plt.plot(x, x + 4, linestyle='-')  # 实线
plt.plot(x, x + 5, linestyle='--') # 虚线
plt.plot(x, x + 6, linestyle='-.') # 点虚线
plt.plot(x, x + 7, linestyle=':');  # 点线
png

如果你想非常简洁,这些linestylecolor代码可以合并为plt.plot()函数的一个非关键字参数:

plt.plot(x, x + 0, '-g')  # 绿色实线
plt.plot(x, x + 1, '--c') # 青色虚线
plt.plot(x, x + 2, '-.k') # 黑色点虚线
plt.plot(x, x + 3, ':r');  # 红色点线
png

这些单字符颜色代码反映了 RGB(红色/绿色/蓝色)和 CMYK(青色/品红色/黄色/黑色)颜色系统中的标准缩写,通常用于数字彩色图形。

还有许多其他关键字参数可用于微调图的外观; 对于更多详细信息,我建议使用 IPython 的帮助工具查看plt.plot()函数的文档字符串(参见“IPython 中的帮助和文档”)。

调整绘图:轴域限制

在为你的绘图选择默认轴域限制方面,Matplotlib 做得不错,但有时候手动控制会更好。调整轴域限制的最基本方法是使用plt.xlim()plt.ylim()方法:

plt.plot(x, np.sin(x))

plt.xlim(-1, 11)
plt.ylim(-1.5, 1.5);
png

如果由于某种原因你想要反向显示任一轴,你可以简单地颠倒参数的顺序:

plt.plot(x, np.sin(x))

plt.xlim(10, 0)
plt.ylim(1.2, -1.2);
png

一个有用的相关方法是plt.axis()(注意这里axes(复数形式)与axis(单数形式)之间可能存在混淆,前者带有e而后者带有i)。plt.axis()方法允许你通过一次调用来设置xy限制,通过一个指定[xmin, xmax, ymin, ymax]的列表:

注:在本书中,如果axes指代两个轴围成的区域,一律翻译为“轴域”。

plt.plot(x, np.sin(x))
plt.axis([-1, 11, -1.5, 1.5]);
png

plt.axis()方法甚至超出了这个范围,允许你做一些事情,比如自动收紧当前绘图周围的边界:

plt.plot(x, np.sin(x))
plt.axis('tight');
png

它允许你做更高级别的规定,例如确保相等的宽高比,以便在屏幕上,x中的一个单位等于y中的一个单位:

plt.plot(x, np.sin(x))
plt.axis('equal');
png

对于轴域限制和plt.axis方法的其他功能的更多信息,请参阅plt.axis文档字符串。

标注绘图

作为本节的最后一部分,我们将简要介绍图表的标签:标题,轴标签和简单图例。标题和轴标签是最简单的标签 - 有一些方法可用于快速设置它们:

plt.plot(x, np.sin(x))
plt.title("A Sine Curve")
plt.xlabel("x")
plt.ylabel("sin(x)");
png

可以使用函数的可选参数调整这些标签的位置,大小和样式。更多信息请参阅 Matplotlib 文档以及每个函数的文档字符串。

当在单个轴中显示多条线时,创建标记每种线条类型的图例是很有用的。同样,Matplotlib 有一种内置方式,用于快速创建这样的图例。它是通过(你猜对了)plt.legend()方法完成的。虽然有几种有效的方法可以使用它,但我发现使用plot函数的label关键字,指定每行的标签是最简单的:

plt.plot(x, np.sin(x), '-g', label='sin(x)')
plt.plot(x, np.cos(x), ':b', label='cos(x)')
plt.axis('equal')

plt.legend();
png

你可以看到,plt.legend()函数跟踪线条样式和颜色,并将它们匹配正确的标签。指定和格式化图形图例的更多信息,可以在plt.legend的文档字符串中找到;此外,我们将在“自定义图例”中,介绍一些更高级的图例选项。

旁注:Matplotlib 的陷阱

虽然大多数plt函数可以直接转换为ax方法(例如plt.plot()ax.plot()plt.legend()ax.legend()等等,不是所有命令都是这种情况。特别是,设置限制,标签和标题的函数是稍微改动的。要在 MATLAB 风格函数和面向对象方法之间转换,请更改以下东西:

  • plt.xlabel()ax.set_xlabel()
  • plt.ylabel()ax.set_ylabel()
  • plt.xlim()ax.set_xlim()
  • plt.ylim()ax.set_ylim()
  • plt.title()ax.set_title()

在面向对象的绘图接口中,并不单独调用这些函数,而是使用ax.set()方法一次设置所有这些属性,通常更方便:

ax = plt.axes()
ax.plot(x, np.sin(x))
ax.set(xlim=(0, 10), ylim=(-2, 2),
       xlabel='x', ylabel='sin(x)',
       title='A Simple Plot');
png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容