Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表。之前学了numpy,很多地方都可以用matplotlib来画图,这里就学下这个画图库。其实和matlab很像,以前用matlab画图的时候觉得挺好玩的。
名称 | 描述 |
---|---|
axex | 设置坐标轴边界和表面的颜色、坐标刻度值大小和网格的显示 |
backend | 设置目标暑促TkAgg和GTKAgg |
figure | 控制dpi、边界颜色、图形大小、和子区( subplot)设置 |
font | 字体集(font family)、字体大小和样式设置 |
grid | 设置网格颜色和线性 |
legend | 设置图例和其中的文本的显示 |
line | 设置线条(颜色、线型、宽度等)和标记 |
patch | 是填充2D空间的图形对象,如多边形和圆。控制线宽、颜色和抗锯齿设置等 |
savefig | 可以对保存的图形进行单独设置。例如,设置渲染的文件的背景为白色 |
verbose | 设置matplotlib在执行期间信息输出,如silent、helpful、debug和debug-annoying。 |
xticks和yticks | 为x,y轴的主刻度和次刻度设置颜色、大小、方向,以及标签大小。 |
线条风格 | 描述 | 线条风格 | 描述 |
---|---|---|---|
‘-‘ | 实线 | ‘:’ | 虚线 |
‘–’ | 破折线 | ‘-.’ | 点划线 |
标记maker | 描述 | 标记maker | 描述 |
---|---|---|---|
‘o’ | 圆圈 | ‘D’ | 菱形 |
‘h’ | 六边形1 | ‘H’ | 六边形2 |
‘_’ | 水平线 | ‘8’ | 八边形 |
‘p’ | 五边形 | ‘,’ | 像素 |
‘+’ | 点 | ‘.’ | 点 |
’s’ | 正方形 | ‘*’ | 星号 |
‘d’ | 小菱形 | ‘ | ‘ |
‘v’ | 一角朝下的三角形 | ‘<’ | 一角朝左的三角形 |
‘>’ | 一角朝右的三角形 | ‘v’ | 一角朝上的三角形 |
符号 | 颜色 | 符号 | 颜色 |
---|---|---|---|
b | 蓝色 | r | 红色 |
g | 绿色 | y | 黄色 |
c | 青色 | r | 黑色 |
m | 洋红色 | w | 白色 |
Matplotlib中最基础的模块是pyplot,先看一张图:
Title为标题。Axis为坐标轴,Label为坐标轴标注。Tick为刻度线,Tick Label为刻度注释先来看个例子吧:
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
x = np.arange(-10, 10, 0.08)
y = np.sin(x)
#指定图表名称
plt.figure('test1')
#子图,这里是2*2,2行2列的第一个
plt.subplot(2, 2, 1)
#画模型的图,plot函数默认画连线图,指定r为颜色红色
plt.plot(x, y, 'r')
plt.subplot(2, 2, 2)
#限制x,y范围
plt.xlim(-5, 5)
plt.ylim(-1, 1)
#指定为*,星号
plt.plot(x, y, '*')
y_data = y + np.random.normal(0, 0.1, 250)
plt.subplot(2, 2, 3)
plt.plot(x, y_data, '.')
plt.xlim(-5, 5)
plt.ylim(-1, 1)
plt.subplot(2, 2, 4)
plt.plot(x, y, 'k')
#scatter可以更容易地生成散点图
plt.scatter(x, y_data)
plt.xlim(-5, 5)
plt.ylim(-1, 1)
plt.show()
运行如下所示:
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
#一个map表示购物的年龄段,已经对应的可视化图的颜色
shop_map = {
'young': (55, '#7199cf'),
'middle': (288, '#4fc4aa'),
'old': (22, '#e1a7a2')
}
fig = plt.figure('Bar chart & Pie chart')
ax = fig.add_subplot(121)
ax.set_title('Shopping age - bar chart')
#生成x轴每个元素的位置
xticks = np.arange(3)
# 定义柱状图每个柱的宽度
bar_width = 0.5
#年龄段
age = shop_map.keys()
#人数
numbers = [x[0] for x in shop_map.values()]
#颜色
colors = [x[1] for x in shop_map.values()]
#柱状图
bars = ax.bar(xticks, numbers, width=bar_width, edgecolor='none')
# 设置y轴的标题
ax.set_ylabel('numbers')
# x轴每个标签的具体位置,设置为每个柱的中央
ax.set_xticks(xticks+bar_width/2)
# 设置每个标签的名字
ax.set_xticklabels(age)
# 设置x轴,y轴的范围
ax.set_xlim([bar_width/2-0.5, 3-bar_width/2])
ax.set_ylim([0, 300])
# 给每个bar分配指定的颜色
for bar, color in zip(bars, colors):
bar.set_color(color)
bx = fig.add_subplot(122)
bx.set_title('Shopping age - pie chart')
labels = ['{}\n{}'.format(age, number) for age, number in zip(age, numbers)]
# 画饼状图,并指定标签和对应颜色
bx.pie(numbers, labels=labels, colors=colors)
plt.show()
运行结果如下:
Matplotlib中也能支持一些基础的3D图表,比如曲面图,散点图和柱状图。这些3D图表需要使用mpl_toolkits模块
# -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
#第一个子图,surface图
ax = fig.add_subplot(1, 2, 1, projection='3d')
X = np.arange(-4, 4, 0.1)
Y = np.arange(-4, 4, 0.1)
X, Y = np.meshgrid(X, Y)
R = np.sqrt(X**2 + Y**2)
Z = np.sin(R)
# alpha定义透明度,cmap是color map
# rstride和cstride是两个方向上的采样,越小越精细,lw是线宽
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='rainbow', lw=0)
# 第二个子图,网线图
ax = fig.add_subplot(1, 2, 2, projection='3d')
ax.plot_wireframe(X, Y, Z, rstride=1, cstride=1, lw=0.5)
plt.show()
运行结果如下:
# -*- coding: utf-8 -*-
import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D
np.random.seed(42)
n_samples = 500
dim = 3
# 先生成一组3维正态分布数据,数据方向完全随机
samples = np.random.multivariate_normal(
np.zeros(dim),
np.eye(dim),
n_samples
)
# 通过把每个样本到原点距离和均匀分布吻合得到球体内均匀分布的样本
for i in range(samples.shape[0]):
r = np.power(np.random.random(), 1.0/3.0)
samples[i] *= r / np.linalg.norm(samples[i])
upper_samples = []
lower_samples = []
for x, y, z in samples:
if z > 5*x + 2*y -1:
upper_samples.append((x, y, z))
else:
lower_samples.append((x, y, z))
fig = plt.figure('3D scatter')
ax = fig.add_subplot(111, projection='3d')
uppers = np.array(upper_samples)
lowers = np.array(lower_samples)
# 用不同颜色不同形状的图标表示平面上下的样本
# 判别平面上半部分为红色菱形,下半部分为青色三角
ax.scatter(uppers[:, 0], uppers[:, 1], uppers[:, 2], color='r', marker='D')
ax.scatter(lowers[:, 0], lowers[:, 1], lowers[:, 2], color='c', marker='^')
plt.show()
运行结果如下:
Matplotlib也支持图像的存取和显示。
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
plt.figure('A Little Cat')
#读取图片
cat_img = plt.imread('36.jpg')
#原图
plt.subplot(121).imshow(cat_img)
#灰度图
img = np.array(cat_img)
if img.ndim == 3:
img = img[:,:,0]
plt.subplot(122).imshow(img, cmap='gray')
plt.show()
运行结果如下:
此外还有更多的画图方式可以参考官网:
http://matplotlib.org/gallery.html
附,参考:
http://python.jobbole.com/85106/
https://zhuanlan.zhihu.com/p/24309547
python的matplotlib画图就先学习到这里,接下去学习scipy吧。