
本节继续探讨数值关系型图表的绘制,主要探讨了气泡图、三维散点图、等高线图和曲面图的绘制方法。
一、数值关系型图表(2)
1.4 气泡图
气泡图是一种多变量图表,是散点图的变体,也可认为是散点图和百分比区域图的组合。气泡图需要三个变量确定,前两个维度数据确定气泡的位置,与散点图不同的是,每一个气泡的面积代表第三维度的数据。气泡图通过气泡的位置和大小,可以分析数据之间的相关性。
注:1、气泡图的大小是映射到面积的而不是半径或直径,如果是半径或直径,气泡大小会呈现指数级变化,还会导致视觉误差。
2、气泡大小通过1个视觉特征来表示,为了避免数据的重叠、遮挡,一般要设置透明度。另外的,也可以添加颜色渐变的气泡图(2个视觉特征)来表示,可以观察到数据的变化。
语法:
plt.scatter(x,y,s,c,marker,cmap,alpha,**kwargs)
语法解释与上一节散点图一致。
示例代码:
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
x = 4 + np.random.normal(0, 2, 24)
y = 4 + np.random.normal(0, 2, len(x))
sizes = np.random.uniform(15, 80, len(x))*10
colors = np.random.uniform(15, 80, len(x))
fig = plt.figure(figsize = (8, 8))
#默认绘图,利用默认的颜色
ax1 = fig.add_subplot(221)
ax1.scatter(x, y, s = sizes, alpha = .3)
#设置颜色数组,利用默认的颜色条带
ax2 = fig.add_subplot(222)
ax2.scatter(x, y, s = sizes, c = colors, alpha = .6)
#设置颜色数组,指定颜色条带,添加颜色指示图例
ax3 = fig.add_subplot(212)
cf = ax3.scatter(x, y, s = sizes, c = y, cmap = 'jet', alpha = .6)
cbar = fig.colorbar(cf, ax = ax3, extend = 'both', orientation='horizontal')
cbar.set_label("Value")
plt.show()
1.5 三维散点图/气泡图
对于以上的气泡图数据,我们也可以将三维数据绘制到三维坐标系中,也就是三维散点图。
绘制三维散点图,需要指定画布的类型为三维坐标系,也即添加语句:ax = fig.add_subplot(221, projection='3d')
语法:plt.scatter(x,y,z,s,c,cmap,alpha,**kwargs)
参数解释类似散点图,只不过z代表数据点的垂直坐标。
代码示例(利用上一个例子的数据):
fig = plt.figure(figsize = (10, 10))
#2维散点图
ax1 = fig.add_subplot(221)
ax1.scatter(x, y, s = sizes, c = colors, cmap = 'jet', alpha = .6)
#设置三维散点图,指定z值为sizes数组
ax2 = fig.add_subplot(222, projection = '3d')
ax2.scatter(x, y, sizes, c = colors, cmap = 'jet', alpha = .6)
#指定z值和大小为sizes数组
ax3 = fig.add_subplot(223, projection = '3d')
ax3.scatter(x, y, sizes, s = sizes, c = colors, cmap = 'jet', alpha = .6)
#旋转三维图,azim表示绕着Z轴旋转,elev表示绕着Y轴旋转
ax4 = fig.add_subplot(224, projection = '3d')
ax4.scatter(x, y, sizes, s = sizes, c = colors, cmap = 'jet', alpha = .6)
ax4.view_init(azim = 40, elev = 20)
plt.show()
1.6 等高线图
等高线图是可视化二维空间标量场的基本方法,可以将三维数据以二维的方式表现出来。
语法:plt.contour([x,y],z,levels,**kwargs)
参数解释:
x,y:形状与z一致,是一个二维数组。
z:在x,y位置下的高度值。
levels:如果为整数n,则在z的最大值和最小值之间自动寻找不大于n+1条间隔的最优化等高线。也可以传入数组,表示等高线的值,但是必须从大到小排列。
**kwargs:其他参数,例如colors(等高线颜色);camp(颜色映射)等等。
#构建子图,3行2列,在列上共享x轴,行上共享y轴
fig, ax = plt.subplots(3, 2, sharex = 'col', sharey = 'row', figsize = (10, 15))
#构造数据
N = 100
x = np.linspace(-2, 2, N)
y = np.linspace(-2, 2, N)
X, Y = np.meshgrid(x, y) ##关键语法,生成格网化的X,Y
def Z(a, b): #Z值生成规则
return (1 - b ** 5 + a ** 5) * np.exp(-a ** 2 - b ** 2)
#生成10条等高线,颜色为黑色
ax1 = ax[0, 0]
ax1.contour(X, Y, Z(X, Y), 10, colors='k')
#生成10条等高线,并添加等高线的数值,保留2位小数
ax2 = ax[0, 1]
labels = ax2.contour(X, Y, Z(X, Y), 10, colors='k')
ax2.clabel(labels, inline=True, colors=['k', 'r', 'g', 'b'], fmt='%.2f')
#为每条等高线设置颜色,一共10条等高线,按照k,r,g,b分别设色,并设置线形
ax3 = ax[1, 0]
colors = ['k', 'r', 'g', 'b']
labels = ax3.contour(X, Y, Z(X, Y), 10, colors = colors, linestyles = '--')
ax3.clabel(labels, inline = True, colors = colors, fmt = '%.2f')
#为等高线设置颜色映射,映射名称为jet
ax4 = ax[1, 1]
labels = ax4.contour(X, Y, Z(X, Y), 10, cmap = 'jet')
ax4.clabel(labels, inline = True, colors = 'k', fmt = '%.2f')
#传入levels数组,手动设置等高线条数和数值
ax5 = ax[2, 0]
labels = ax5.contour(X, Y, Z(X, Y), levels = [-0.6, -0.3, 0.0, 0.4, 0.8], cmap = 'jet')
ax5.clabel(labels, inline = True, colors = 'k', fmt = '%.2f')
#等高线填充颜色,就将contour改为contourf即可
ax6 = ax[2, 1]
ax6.contourf(X, Y, Z(X, Y), levels = 10, cmap = 'jet')
labels = ax6.contour(X, Y, Z(X, Y), levels = 10, cmap = 'jet')
ax6.clabel(labels, inline = True, colors = 'k', fmt = '%.2f')
#调整子图水平、垂直间距
plt.subplots_adjust(wspace = 0.05, hspace = 0.05)
plt.show()
1.7 曲面图
曲面图实际上是对等高线图的延伸,将等高线上的z值用第三维数值表示。
注:使用曲面图首先要创建一个axes3D对象。
语法:
axes3D.plot_surface(x,y,z,**args)
代码示例(使用上一个例子的数据):
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure(figsize = (7, 7))
ax2 = Axes3D(fig) #生成axes3D对象
#绘制曲面图
cf = ax2.plot_surface(X, Y, Z(X, Y), cmap = 'jet', alpha = .8)
#绘制等高线图,offset表示z值所处位置
labels = ax2.contour(X, Y, Z(X, Y), levels = 10, cmap = 'jet', offset = -0.6, linestyles = '--')
ax2.clabel(labels, inline = True, colors = 'k', fmt = '%.2f')
#绘制色条
cbar = fig.colorbar(cf, ax = ax2, orientation='horizontal', pad = -0.01)
cbar.set_label("Value")
plt.show()
本文分享自 python数据可视化之美 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!