matplotlib 画图神器

Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。

加上mpl_toolkits.mplot3d的3D绘图功能,感觉跟Matlab的绘图功能有的比了,更重要的是可以直接用python绘图,非常适合给机器学习的代码用作可视化工具。

强烈推荐莫烦大神的视频教程《matplotlib

安装方法:pip install matplotlib

几个常用的绘图方法

  • 直线/曲线图:plot
  • 柱状图:bar
  • 点状图:scatter
  • 等高线图:contourf contour
  • 3D曲面:plot_surface (需要配合mpl_toolkits库)
  • 多个子图:subplot

下面我列举了不同图形的代码和图片效果,主要摘抄莫烦大神的教程,不过我加上了额外的一些详细注释。上手就能运行。

直线/曲线图

import matplotlib.pyplot as plt
import numpy as np 

# 画二维图
x = np.linspace(-3, 3, 50)  # 范围和个数
y1 = 2 * x + 1  # 直线
y2 = x ** 2 # 曲线

# -------------- 最简单的图像展示 --------------
# plt.figure()
# plt.plot(x, y2)
# plt.show()

# -------------- 带参数的图像展示 --------------
plt.figure(num=3, figsize=(8,5),) # num:编号(图像文件标题为Figure_num), figsize:大小

# 直接绘图
# plt.plot(x, y2)
# plt.plot(x, y1, color='red', linewidth=1.0, linestyle='--')

# 带图例的图像展示,显示哪根线是哪根线
l1, = plt.plot(x, y1, label='linear line') # l1以逗号结尾,因为plt返回的是一个列表
l2, = plt.plot(x, y2, color='red', linewidth=1.0, linestyle='--', label='square line')
# plt.legend(loc='lower right') # 把图例放在不同的位置组合  upper lower center right left
plt.legend(handles=[l1, l2], labels=['l1', 'l2'],  loc='best') # 可以重命名label, 并自动选择最佳位置放图例
 # 'best' : 0,          
 # 'upper right'  : 1,
 # 'upper left'   : 2,
 # 'lower left'   : 3,
 # 'lower right'  : 4,
 # 'right'        : 5,
 # 'center left'  : 6,
 # 'center right' : 7,
 # 'lower center' : 8,
 # 'upper center' : 9,
 # 'center'       : 10,

# 坐标轴设置
plt.xlabel('X axis') # x坐标轴
plt.ylabel('Y axis') # y坐标轴

plt.xlim((-1, 2)) # x刻度范围
plt.ylim((-2, 3)) # y刻度范围

plt.xticks(np.linspace(-1, 2, 5)) # 重定义x轴刻度
plt.yticks([-2, -1.8, -1, 1.22, 3], [r'$really\ bad$', r'$bad$', r'$normal$', r'$good$', r'$really\ good$']) # 重定义y轴刻度

axy = plt.gca() # 获取当前坐标轴信息
axy.spines['right'].set_color('none') # 设置右边框为空
axy.spines['top'].set_color('none') # 设置顶边框为空
axy.xaxis.set_ticks_position('bottom') # 设置x轴坐标刻度数字的位置为bottom(还有top\both\default\none)
axy.spines['bottom'].set_position(('data', 0)) # 把bottom边框移到y=0的位置 (位置属性:outward\axes\data)
axy.yaxis.set_ticks_position('left') # 设置y轴坐标刻度数字为left
axy.spines['left'].set_position(('data', 0)) # 把left边框移动到x=0的位置

# 画点和垂直线,并对点进行标注
x0 = 0.5
y0 = 2*x0 + 1
plt.plot([x0, x0,], [0, y0,], 'k--', linewidth=2.5) # 画出一条垂直于x轴的虚线.
plt.scatter([x0, ], [y0, ], s=50, color='b') # 画点
plt.annotate(r'$2x+1=%s$' % y0,     # 标注的文字
             xy=(x0, y0),           # 标注的数据点
             xycoords='data',       # 基于数据的值来选位置
             xytext=(+20, -30),     # 标注的位置(相对坐标位置)
             textcoords='offset points',   # xy偏差值
             fontsize=12,           # 字体大小
             arrowprops=dict(arrowstyle='->', connectionstyle="arc3, rad=.3")) # 连线类型设置为箭头,有弧度, rad为弧度值

# 添加注释
plt.text(0.5, -1.8, r'$Text:\ \mu\ \sigma_i\ \alpha_t.\ written\ by\ likejiao.$')

# 最后展示图片
plt.show()
plot

柱状图

import matplotlib.pyplot as plt
import numpy as np 

n = 12 # 生成n个数据
X = np.arange(n) # X为0到n-1的整数
Y1 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n) # Y1和Y2都是随机分布的数据
Y2 = (1 - X / float(n)) * np.random.uniform(0.5, 1.0, n)

plt.bar(X, +Y1) # 画在坐标轴上方
plt.bar(X, -Y2) # 画在坐标轴下方

# 设置横纵坐标的边界,去掉横坐标的线
plt.xlim(-.5, n)
plt.xticks(())
plt.ylim(-1.25, 1.25)
plt.yticks(())

# 加颜色优化图像,facecolor设置主体颜色,edgecolor设置边框颜色
plt.bar(X, +Y1, facecolor='#9999ff', edgecolor='white')
plt.bar(X, -Y2, facecolor='#ff9999', edgecolor='white')

# 加数值优化图像
for x, y in zip(X, Y1):
    # ha: horizontal alignment 横向对齐
    # va: vertical alignment 纵向对齐
    plt.text(x + 0.4, y + 0.05, '%.2f' % y, ha='center', va='bottom')

for x, y in zip(X, Y2):
    # ha: horizontal alignment
    # va: vertical alignment
    plt.text(x + 0.4, -y - 0.05, '%.2f' % y, ha='center', va='top')

# 最后展示图片
plt.show()
bar

点状图

import matplotlib.pyplot as plt
import numpy as np 

n = 1024 # 数据集的大小,下面两行生产1024个呈正态分布的二维数据组(平均数是0,方差是1)
X = np.random.normal(0, 1, n) # 每一个点的X值
Y = np.random.normal(0, 1, n) # 每一个点的Y值
T = np.arctan2(Y, X) # 计算每一个点的颜色

plt.scatter(X, Y, s=75, c=T, alpha=.5) # s:size, c:color, alpha透明度为50%

plt.xlim(-1.5, 1.5)
plt.xticks(()) # 隐藏x坐标轴
plt.ylim(-1.5, 1.5)
plt.yticks(()) # 隐藏y坐标轴

# 最后展示图片
plt.show()
scatter

等高线图

import matplotlib.pyplot as plt
import numpy as np

def f(x,y):
    # the height function 生成高度值
    return (1 - x / 2 + x**5 + y**3) * np.exp(-x**2 -y**2) 

# 生成n个数值
n = 256
x = np.linspace(-3, 3, n)
y = np.linspace(-3, 3, n)
X,Y = np.meshgrid(x, y) # 在二维平面上把每一个x和y一一对应编织成栅格

# plt.contourf 填充颜色
# X, Y and value for (X,Y) point 
plt.contourf(X, Y, f(X, Y), 8, alpha=.75, cmap=plt.cm.hot) # alpha:透明度, cmap:可以生成对应的暖色组, 其中8代表等高线的密集程度

# contour等高线绘制
C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidths=.5) # colors:颜色, linewidth:线宽, 其中8代表等高线的密集程度

# 等高线中加入文字标注
plt.clabel(C, inline=True, fontsize=10) # inline:是否把文字画在线里
plt.xticks(()) # 隐藏x坐标轴
plt.yticks(()) # 隐藏y坐标轴

# 最后展示图片
plt.show()
contour

3D曲面

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

# 先定义一个图像窗口,在窗口上添加3D坐标轴
fig = plt.figure()
ax = Axes3D(fig)

# 给X, Y赋值
X = np.arange(-4, 4, 0.25)
Y = np.arange(-4, 4, 0.25)
X, Y = np.meshgrid(X, Y)    # x-y 平面的网格
R = np.sqrt(X ** 2 + Y ** 2)
# 计算高度值
Z = np.sin(R)
# Z = (1 - X / 2 + X**5 + Y**3) * np.exp(-X**2 -Y**2) # drawcontours.py里的等高线函数

# 三维曲面,并将一个 colormap rainbow 填充颜色,之后将三维图像投影到 XY 平面上做一个等高线图。
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow')) # rstride:row的跨度, cstride:column的跨度

# 添加XY平面的等高线
ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap=plt.get_cmap('rainbow')) # zdir:沿着z轴方向投影, offset相对于z=0的偏移距离

# 设置z轴的坐标范围,显得好看一点
ax.set_zlim(-2,2)

# 最后展示图片
plt.show()
3D

多个子图

import matplotlib.pyplot as plt

plt.figure()

# 创建小图
plt.subplot(2,2,1)
plt.plot([0,1],[0,1]) # 在第1个位置创建一个小图.

plt.subplot(2,2,2)
plt.plot([0,1],[0,2]) # 在第2个位置创建一个小图.

plt.subplot(223) #plt.subplot(2,2,3)可以简写
plt.plot([0,1],[0,3])

plt.subplot(224)
plt.plot([0,1],[0,4])


# 最后展示图片
plt.show()  # 展示
subplot

最后推荐一下50个高级画图案例:>>>传送门<<<

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

推荐阅读更多精彩内容

  • Matplotlib 也可以绘制 3D 图像,与二维图像不同的是,绘制三维图像主要通过 mplot3d 模块实现。...
    听城阅读 5,665评论 0 3
  • 参考:给深度学习入门者的Python快速教程 - Numpy和Matplotlib篇 简单的y折线图(x为y对应元...
    五秋木阅读 1,294评论 0 0
  • 前言 有时候为了直观,我们需要将数据可视化,Python编程中最为常用的一个库是matplotlib。那么什么是m...
    TensorFlow开发者阅读 5,267评论 2 47
  • 一、新媒体核心知识:不断地保持输 二、无论转向什么岗位,其实都是遵循五大步骤: 你要明确你为什么要转行,新媒体运营...
    我是我自己的盖世英雄gogo阅读 238评论 0 1
  • 锐化后:(忽略旁边宝宝涂的红色) 完成图,无滤镜
    lummo阅读 174评论 0 1