【数据可视化】Matplotlib用法(附实例)

📖 一、Matplotlib库相关介绍

【介绍】:Matplotlib 是建立在Numpy数组基础上的多平台数据可视化程序库。

📖 二、设置图形标签

【第一种】:MATLIB 风格
plt.plot(x,np.sin(x))
plt.title("A Sine Curve")
plt.xlabel("x")
plt.ylabel("sin(x)")
MATLIB 风格
【第二种】:面向对象风格
# 设置时,要做如下形式的变换
#plt.xlabel => ax.set_xlabel
ax = plt.axes()
ax.plot(x,np.sin(x))
ax.set_xlabel("x")
ax.set_ylabel("sin(x)")
ax.set_title('A Sine Curve')
面向对象风格

📖 三、设置图例

【第一步】:绘制图例(参数为:label)
plt.plot(x,np.sin(x),'-g',label="sin(x)")
plt.plot(x,np.cos(x),':b',label="cos(x)")

#显示图例
plt.legend()
显示图例
【第二步】:配置图例
x = np.linspace(0,10,1000)
fig,ax = plt.subplots()
ax.plot(x,np.sin(x), '-b', label="Sine")
ax.plot(x,np.cos(x),'--r', label="Cosine")
ax.axis('equal')

leg = ax.legend(loc='upper left',frameon=False, ncol=2)

【注释】:Matplotlib中显示图形时调用legend()函数,其中有以下几个较为常用的参数

  • loc: 位置参数;
  • frameon: 去掉边框;
  • ncol: 图例的列数;
配置图例
【第三步】:其他配置
x = np.linspace(0,10,1000)
fig,ax = plt.subplots()
ax.plot(x,np.sin(x), '-b', label="Sine")
ax.plot(x,np.cos(x),'--r', label="Cosine")
ax.axis('equal')
- fancybox:圆角边框
- framealpha: 边框的透明度
- shadow:阴影
- borderpad:边距
leg = ax.legend(fancybox=True, framealpha=0.5, shadow=True,borderpad=1)

【注释】:Matplotlib中显示图形时调用legend()函数,其中有以下几个较为常用的参数:

  • fancybox:圆角边框;
  • framealpha: 边框的透明度;
  • shadow:阴影;
  • borderpad:边距;
output_相关配置
【第四步】:设置多个图例
fig,aix = plt.subplots()
styles = ['-','--','-.',':']
lines = []

x = np.linspace(0,10,1000)
for i in range(4):
    lines += aix.plot(x,np.sin(x - i * np.pi / 2),styles[i],color='black')

# 设置第一个图的图例
aix.legend(lines[:2],['Line A','Line B'], loc='upper right', frameon=False)

# 设置第二个图例
from matplotlib.legend import Legend
leg = Legend(aix,lines[2:],['LineC','LineD'],loc='lower right',frameon=False)
aix.add_artist(leg)

aix.axis('equal')
plt.show()
output_多个图例

📖 四、绘制简易散点图

【第一步】:基本绘制
x = np.linspace(0,10,30)
y = np.sin(x)
# 参数o用来表示图形符号
plt.plot(x,y,'o',color='black')

【解释】:这里使用参数o用来表示图形符号。

output_基本绘制
【第二步】:设置样式

样式种类有许多,在绘图过程中,可以更具自己的偏好选择样式,主要样式如下:

rng = np.random.RandomState(0)
for marker in ['o','.',',','x','+','v','^','<','>','s','d']:
    plt.plot(rng.rand(5),rng.rand(5),marker, label="marker='{0}'".format(marker))
    plt.legend(numpoints=1)
    plt.xlim(0,1.8)
output_设置样式
【第三步】:同时画出点线和折线
plt.plot(x,y,'-ok')
output_点线和折线
【第四步】:散点图的其他属性
plt.plot(x,y,'-p',color='gray',markersize=15,linewidth=4,markerfacecolor='white',markeredgecolor='gray',markeredgewidth=2)
  • markersize:对应坐标图形尺寸,这里设置为15px;
  • linewidth:线条尺寸(粗细):这里设置为4px;
  • markerfacecolor:图形颜色;
  • markeredgecolor:图形边框以及线条颜色;
  • markeredgewidth:边框线尺寸(粗细),这里设置为2px;
output_其他属性
【第五步】:使用 plt.scatter 绘制散点图

(特点): scatter 与 plot 相比,拥有更高的灵活性,可以控制每个散点。

# scatter 与 plot 相比,拥有更高的灵活性,可以控制每个散点。
plt.scatter(x,y,marker='o')
output_scatter绘图
【第六步】:通过 scater 控制每个点
rng = np.random.RandomState(0)
x = rng.randn(100)
y = rng.randn(100)
colors = rng.rand(100)
sizes = 1000 * rng.rand(100)
plt.scatter(x,y,c=colors,alpha=0.3,s=sizes,cmap='viridis')

# 显示颜色条
plt.colorbar()
output_26_1.png

📖 五、基本误差线图

x = np.linspace(0,10,50)
dy = 0.8
y = np.sin(x) + dy * np.random.randn(50)
plt.errorbar(x,y,yerr=dy,fmt='.k')
output_误差线图

📖 六、等高线图

【第一步】:绘制基本等高线图
# 生成坐标
def f(x,y):
    return np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x)
x = np.linspace(0,5,50)
y = np.linspace(0,5,40)

# 生成x,y组成坐标的集合
X,Y = np.meshgrid(x,y)
z = f(X,Y)
# 绘制图形
# 当只有一种颜色时,实线表示正数,虚线表示负数
plt.contour(X,Y,z,colors='black')
output_基本等高线图
【第二步】:使用预定义的配色方案

plt.cm.<Tab>:可以查看有一共有多少种预定义的配色方案。

# 使用预定义的配色方案:RdGy红灰方案
#可以通过plt.cm.<Tab>,来查看一共有哪些方案
plt.contour(X,Y,z,cmap='RdGy')
output_配色
【第三步】:生成带填充色的等高线图
# plt.contourf(X,Y,z,cmap='RdGy')
# (参数)10 : 表示等高线的密集程度
plt.contourf(X,Y,z,10,cmap='RdGy')
plt.colorbar()
output_填充色
【第四步】:将等高线渲染成渐变图

感觉是通过打马赛克的方式,来实现模糊化渲染。

# 将数组z对应的点渲染为图象
plt.imshow(z,extent=[0,5,0,5],origin='lower',cmap="RdGy")
plt.colorbar()
plt.axis(aspect='image')
output_渐变图
【第五步】:将等高线图和渐变图叠加一起

我们看见的等高线图当然不象这么简陋,但是通过Matplotlib可以实现类似的功能。

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.3)
plt.colorbar()
output_33_1.png

📖 七、频次直方图

data = np.random.randn(1000)
plt.hist(data)
plt.show()
output_基本直方图
【第一步】:设置直方图的样式
plt.hist(data,bins=30,alpha=0.5,histtype='stepfilled',color='steelblue',edgecolor='black')
plt.show()
output_直方图样式

案例:

x1 = np.random.normal(0,0.8,1000)
x2 = np.random.normal(-2,1,1000)
x3 = np.random.normal(3,2,1000)

kwargs = dict(histtype="stepfilled",alpha=0.3,bins=40)
plt.hist(x1,**kwargs)
plt.hist(x2, **kwargs)
plt.hist(x3, **kwargs)
plt.show()
output_案例
【第二步】:使用 plt.hist2d()生成二维频次直方图

生成两组符合正太分布、协方差矩阵为cov的数据

# 生成两组符合正太分布、协方差矩阵为cov的数据
mean = [0,0]
cov = [[1,1],[1,2]]
x, y = np.random.multivariate_normal(mean,cov,10000).T
# 使用hist2d绘制二维频次直方图
plt.hist2d(x,y,bins=30,cmap='Blues')
cb = plt.colorbar()
cb.set_label("counts in bins")
output_二维频次直方图
【第三步】: 生成六边形区间划分的二维频次直方图

默认情况下,二维频次直方图是由正方形组成的,可以使用plt.hexbin() 方法绘制六边形组成的二位频次直方图。

# 六边形区间划分
plt.hexbin(x,y,gridsize=30,cmap='Blues')
cb = plt.colorbar(label = 'Counts in bins')
output_六边形区间划分

📖 八、多子图

# 新建一个子图
ax1 = plt.axes()
ax2 = plt.axes([0.65,0.65,0.2,0.2])
output_新建一个子图
【第一步】:通过 fig.add_axes([xpos,ypos,width,height])创建子图
fig = plt.figure()
ax1 = fig.add_axes([0.1,0.5,0.8,0.4])
ax2 = fig.add_axes([0.1,0.1,0.8,0.4])
x = np.linspace(0,10)
ax1.plot(np.sin(x))
ax2.plot(np.cos(x))
output_多子图
【第二步】:通过 plt.subplot() 方法创建子图
# 创建网格子图
for i in range(1,7):
    plt.subplot(2,3,i)
    plt.text(0.5,0.5,str((2,3,i)),fontsize=18, ha='center')
output_45_0.png
【第二步】:使用 fig.subplots_adjust() 调整子图之间的间隔
fig = plt.figure()
fig.subplots_adjust(hspace=0.4,wspace=0.4)
for i in range(1,7):
    plt.subplot(2,3,i)
    plt.text(0.5,0.5,str((2,3,i)),fontsize=18, ha='center')
output_46_0.png
【第二步】:使用 plt.subplots()创建子图
# plt.subplots()  一行代码,创建网格
fig,ax = plt.subplots(2,3,sharex='col',sharey='row')
output_47_0.png
# 绘制子图内容
for i in range(2):
    for j in range(3):
        ax[i,j].text(0.5, 0.5, str((i,j)),fontsize=18,ha='center')
fig
output_子图内容
【第二步】:使用 plt.GridSpec() 创建不规则网格布局

grid = plt.GridSpec(2,3,wspace=0.4, hspace=0.3)
plt.subplot(grid[0,0])
plt.subplot(grid[0,1:])
plt.subplot(grid[1,:2])
plt.subplot(grid[1,2])
output_规则网格布局

实例:绘制多轴频次直方图

# 创建正太分布的数据
mean = [0,0]
cov = [[1,1],[1,2]]
x, y = np.random.multivariate_normal(mean, cov,200).T

# 设置坐标轴和网格的配置方式
fig = plt.figure(figsize=(6,6))
grid = plt.GridSpec(4,4,hspace=0.2, wspace=0.2)
main_ax = fig.add_subplot(grid[:-1,1:])
y_hist = fig.add_subplot(grid[:-1,0],xticklabels=[],sharey=main_ax)
x_hist = fig.add_subplot(grid[-1,1:],xticklabels=[],sharex=main_ax)

# 主坐标轴画散点图
main_ax.plot(x,y,'ok',markersize=3,alpha=0.2)

# 次坐标的频次直方图
x_hist.hist(x,40,histtype='stepfilled',orientation='vertical', color='gray')
# 反转y轴
x_hist.invert_yaxis()

y_hist.hist(y,40,histtype='stepfilled',orientation='horizontal', color='gray')
# 反转x轴
y_hist.invert_xaxis()
output_多轴频次直方图

📖 九、给图形添加箭头和文本

fig,ax = plt.subplots()
x = np.linspace(0,20,1000)
ax.plot(x,np.cos(x))
ax.axis('equal')


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

推荐阅读更多精彩内容