数据科学 IPython 笔记本 8.7 密度和等高线图

8.7 密度和等高线图

原文:Density and Contour Plots

译者:飞龙

协议:CC BY-NC-SA 4.0

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

有时,使用等高线或颜色编码的区域,在二维中显示三维数据是有用的。有三个 Matplotlib 函数可以帮助完成这个任务:`plt.contour用于等高线图,plt.contourf用于填充的等高线图,plt.imshow``用于显示图像。本节介绍使用这些的几个示例。 我们首先为绘图配置笔记本,并导入我们将使用的函数:

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

可视化三维函数

我们首先使用z = f(x, y)函数演示等高线图,为f使用以下特定选项(当我们将它用作数组广播的动机示例时,我们之前在“数组计算:广播”中看到过它们):

def f(x, y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)

可以使用plt.contour函数创建等高线图。它需要三个参数:x值的网格,y值的网格和z值的网格。xy值表示图上的位置,z值将由等高线水平表示。也许准备这样的数据最直接的方法是使用np.meshgrid函数,它从一维数组构建二维网格:

x = np.linspace(0, 5, 50)
y = np.linspace(0, 5, 40)

X, Y = np.meshgrid(x, y)
Z = f(X, Y)

现在让我们看一下仅有线的标准等高线图:

plt.contour(X, Y, Z, colors='black');
png

请注意,默认情况下,使用单一颜色时,负值由虚线表示,正值由实线表示。或者,可以通过cmap参数,指定颜色表来对线条进行颜色编码。在这里,我们还指定我们想要绘制更多的线 - 数据范围内的 20 个等距间隔:

plt.contour(X, Y, Z, 20, cmap='RdGy');
png

在这里,我们选择了RdGyRed-Gray的缩写)颜色表,这是居中数据的不错选择。Matplotlib 提供了各种各样的色彩表,你可以通过在plt.cm模块上的 TAB 补全,在 IPython 中轻松浏览它们:

plt.cm.<TAB>

我们的绘图看起来更好,但线条之间的空间可能有点分散。通过使用plt.contourf()函数(注意末尾的f),我们可以切换到填充的等高线图来改变它,它使用与plt.contour()大致相同的语法。。

另外,我们将添加一个plt.colorbar()命令,它会自动创建一个附加轴,带有绘图的标记的颜色信息:

plt.contourf(X, Y, Z, 20, cmap='RdGy')
plt.colorbar();
png

颜色条清楚地表明黑色区域是“峰值”,而红色区域是“谷值”。

这个绘图的一个潜在问题是它有些“噪点”。 也就是说,颜色阶梯是离散的而不是连续的,这并不总是所希望的。

这可以通过将等高线数设置为非常高的数量来解决,但这会使的绘图相当低效:Matplotlib必须为等高线中的每个阶梯渲染一个新的多边形。处理这个的更好方法是使用plt.imshow()函数,它将二维数据网格解释为图像。

以下代码显示了这一点:

plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower',
           cmap='RdGy')
plt.colorbar()
plt.axis(aspect='image');
png

但是,imshow()有一些潜在的问题:

  • plt.imshow()不接受xy网格,所以你必须在绘图上手动指定图像的边界[xmin, xmax, ymin, ymax]
  • plt.imshow()默认遵循标准图像数组定义,其中原点位于左上角,而不是大多数等高线图中的左下角。 显示网格化数据时必须更改此值。
  • plt.imshow()将自动调整轴纵横比来匹配输入数据;这可以通过设置,例如plt.axis(aspect ='image')来使xy单位匹配来更改。

最后,有时可以将等高线图和图像绘图组合起来。例如,在这里我们将使用部分透明的背景图像(通过alpha参数设置透明度)和绘制在上面的等高线图,标签在它上面(使用plt.clabel()函数):

contours = plt.contour(X, Y, Z, 3, colors='black')
plt.clabel(contours, inline=True, fontsize=8)

plt.imshow(Z, extent=[0, 5, 0, 5], origin='lower',
           cmap='RdGy', alpha=0.5)
plt.colorbar();
png

这三个函数的组合 -- plt.contourplt.contourfplt.imshow -- 提供了几乎无限的可能性,来在二维绘图中展示这种三维数据。这些函数中可用选项的更多信息,请参阅其文档字符串。如果你对此类数据的三维可视化感兴趣,请参阅“Matplotlib 中的三维绘图”。

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