最近想寻找一种能利用已有数据画出地理位置分布图的方法,在看Vamei写的博客 绘图: matplotlib核心剖析 学习matplotlib绘图的过程中找到了名为“contour”(等高线图)的绘图方式
等高线图:等高线地图就是将地表高度相同的点连成一环线直接投影到平面形成水平曲线。不同高度的环线不会相合,除非地表显示悬崖或峭壁才能使某处线条太密集出现重叠现像,若地表出线平坦开阔的山坡,曲线间之距离就相当宽。
(ps:从百度百科上扒来的一段话。话说百科上面错别字还是不少的,最后一行的“出现”错写成了“出线”)
对我这种学计算机的工科生来说,接触等高线图大部分(甚至可以说唯一)的机会就在初中和高中时的地理课堂上了,such as :
下面来介绍怎么用matplotlib画简单的等高线图:
代码的参考来自于 绘图: matplotlib核心剖析 和 matplotlib的基本用法(九)——绘制等高线图
# -*- coding:utf-8 -*-
#引入numpy库和matplotlib库
import numpy as np
import matplotlib.pyplot as plt
# 定义等高线图的横纵坐标x,y
#从左边取值为从 -3 到 3 ,各取5个点,一共取 5*5 = 25 个点
x = np.linspace(-3, 3, 5)
y = np.linspace(-3, 3, 5)
# 将原始数据变成网格数据
X, Y = np.meshgrid(x, y)
# 各地点对应的高度数据
#Height是个 5*5 的数组,记录地图上 25 个点的高度汇总
Height = [[0,0,1,2,2],[0,-2,-2,1,5],[4,2,6,8,1],[3,-3,-3,0,5],[1,-5,-2,0,3]]
# 填充颜色
plt.contourf(X, Y, Height, 10, alpha = 0.6, cmap = plt.cm.hot)
# 绘制等高线
C = plt.contour(X, Y, Height, 10, colors = 'black', linewidth = 0.5)
# 显示各等高线的数据标签
plt.clabel(C, inline = True, fontsize = 10)
plt.show()
画出的图如下:
由于这25个取样点的高度数值都是我凭感觉设置的,所以制作出来的效果不是很好,但拿来说明问题基本足够了。
下面简单解释一下代码中主要的函数 contourf 和 contour 中参数的设置:
1.contourf 填充颜色函数
2.contour 绘制等高线函数
如果遇到不能靠单纯输入各点高度值的情况,就需要将Height数组变成一个以横纵坐标X和Y为参数的高度计算函数:
def f(x, y):
return x * y #这里的函数是我简单定义的,要根据现实情况设置符合实际的函数
总代码:
# -*- coding:utf-8 -*-
#引入numpy库和matplotlib库
import numpy as np
import matplotlib.pyplot as plt
# 定义等高线图的横纵坐标x,y
#从左边取值为从 -3 到 3 ,各取5个点,一共取 5*5 = 25 个点
x = np.linspace(-3, 3, 5)
y = np.linspace(-3, 3, 5)
# 将原始数据变成网格数据
X, Y = np.meshgrid(x, y)
# 定义等高线高度函数
def f(x, y):
return x * y
# 填充颜色
plt.contourf(X, Y, f(X,Y), 10, alpha = 0.5, cmap = plt.cm.hot)
# 绘制等高线
C = plt.contour(X, Y, f(X,Y), 10, colors = 'black', linewidth = 0.5)
# 显示各等高线的数据标签
plt.clabel(C, inline = True, fontsize = 10)
plt.show()
画出的图如下:(莫名地有一种对称的美感 2333)
可以在最后的 plt.show() 前加如下两行,将横纵坐标隐藏:
# 去除坐标轴
plt.xticks(())
plt.yticks(())
效果如下:
以上就是用matplotlib画等高线图的基本步骤,以后有机会的话得尝试一下如何绘制功能更强大、更符合实际应用的等高线图。
— 2:55 pm, 2017/6/25.
画等高线的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
import
numpy as np
import
pandas as pd
import
matplotlib.pyplot as plt
# 计算x,y坐标对应的高度值
def
f(x, y):
return
(
1
-
x
/
2
+
x
*
*
5
+
y
*
*
3
)
*
np.exp(
-
x
*
*
2
-
y
*
*
2
)
# 生成x,y的数据
n
=
256
x
=
np.linspace(
-
3
,
3
, n)
y
=
np.linspace(
-
3
,
3
, n)
# 把x,y数据生成mesh网格状的数据,因为等高线的显示是在网格的基础上添加上高度值
X, Y
=
np.meshgrid(x, y)
# 填充等高线
plt.contourf(X, Y, f(X, Y))
# 显示图表
plt.show()
|
上述代码显示的图形为:
这颜色有点太冷了,我们想显示热力图,那只要在plt.contourf()函数中添加属性cmap=plt.cm.hot就能显示热力图,其中cmap代表为color map,我们把color map映射成hot(热力图),此处关键代码为:
1
2
|
# 填充等高线
plt.contourf(X, Y, f(X, Y), cmap
=
plt.cm.hot)
|
显示的图为:
是否显示得挺热的。:)
上面是用plt.contourf()填充了等高线,但还有一种方式是可以直接显示等高线,而不是填充的方式,例如:
1
|
C
=
plt.contour(X, Y, f(X, Y),
20
)
|
这里20代表的是显示等高线的密集程度,数值越大,画的等高线数就越多。
这样显示的图形为: