数据的可视化是数据探索、数据分析中的重要任务,通过可视化可以帮助我们发现数据的异常值、特征的分布情况等,为数据预处理提供重要支持。Spark目前对数据的可视化功能还很弱或还没有,不过没关系,我们可以借助Python或R等可视化功能,Python 和R在数据可视化方面功能很强大,这里以Python的数据可视化为例。Python的数据表现能力很强,其可视化可以使用matplotlib或plot等方法。matplotlib是一种比较低级但强大的绘图工具,可以进行很多定制化,但往往需要较大代码来实现; plot 是一种非常简洁的绘图工具,它主要基于pandas基础之上。
一、matplotlib plt.rcParams['font.sans-serif'] = ['SimHei']
###显示中文
plt.rcParams['axes.unicode_minus'] = False ## 防止坐标轴上的"-"号变为方块
x = np.linspace(0, 10, 100)
y = np.sin(x)
y1 = np.cos(x)
##绘制一个图,长为10,宽为6(默认值是每个单位80像素)
plt.figure(figsize=(10, 6))
###在图列中自动显示$间内容
plt.plot(x, y, label="$sin(x)$", color="red", linewidth=2)
plt.plot(x, y1, "b--", label="$cos(x^2)$") ###b(blue),-- 线形
plt.xlabel(u"X值")
##X坐标名称,u表示unicode编码
plt.ylabel(u"Y值")
plt.title(u"三角函数图像")
##t图名称
plt.ylim(-1.2, 1.2) ##y 上的max、min值
plt.legend()
##显示图例
plt.savefig('fig01.png') ## 保持到当前目录
plt.show()
参考: https://www.jianshu.com/p/78ba36dddad8
1.1.1、Figure&emsp 图像窗口。Figure 是包裹 Axes、tiles、legends 等组件的最外层窗口。它其实是一个 Windows 应用窗口 。
1.1.2、AxesAxes 是轴域/子图。Axes 是带有数据的图像区域。从上文可知,它是位于 Figure 里面。那它和 Figure 是什么关系?这里可能文字难以表述清楚,我以图说文。用两图带你彻底弄清它们的关系。
fig = plt.figure() # 创建一个没有axes的figure
plt.title("No Axes on Figure") # 设置标题
plt.subplots(2, 2) # 创建一个2x2个axes的figure
plt.show() # 展示
根据运行结果图,我们不难看出。左图的 Figure1 中没有 axes,右图的 Figure2 中有 4 个 axes。因此,我们可以将 Axes 理解为面板,而面板是覆在窗口(Figure) 上。
Axis 和 Axes 以及 Figure 这三者关系,你看完下图,会恍然大悟。
x = np.arange(-5, 5, 0.5)
y = 3 * x + 1
y1 = x ** 2 + 5
plt.figure()
plt.plot(x, y, marker='o')
plt.plot(x, y1, color='r', linestyle='--', marker='>')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置显示中文
plt.rcParams['axes.unicode_minus'] = False ## 防止坐标轴上的"-"号变为方块
# 设置坐标轴标签
plt.xlabel("X 轴")
plt.ylabel("Y 轴")
# 限制x, y的范围
# plt.xlim(-3, 5)
# plt.ylim(0, 30)
# 设置精准刻度
# xticks() 和 yticks() 需要传入一个列表作为参数。
# plt.xticks(np.arange(-5, 5, 1))
# plt.yticks(np.arange(-20, 30, 5))
# 该方法默认是将列表的值来设置刻度标签,
# 如果你想重新设置刻度标签,则需要传入两个列表参数给 xticks() 和 yticks() 。
# 第一个列表的值代表刻度,第二个列表的值代表刻度所显示的标签
plt.xticks([-5, -3, 0, 3, 5],
['-5元', '-3元', 0, '3元', '5元' ])
plt.yticks([-10, 0, 10, 20, 30],
['$-10db$', 0, '$10db$', '$20db$', '$30db$']) # 使用$$ 将字符包含, 显示的更好看,
plt.show() # 展示
# Get the current ~matplotlib.axes.Axes instance on the current figure matching the given keyword args, or create one.
ax = plt.gca()
ax.spines['right'].set_color('none') # 右边框消失
ax.spines['top'].set_color('none')
# x,y轴的刻度位置
ax.xaxis.set_ticks_position("bottom")
ax.yaxis.set_ticks_position("right")
ax.spines['bottom'].set_position(('data', 0)) #指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的0这个点上
# ax.spines['left'].set_position(('data', 0))
# 也可以使用axes参数
# ax.spines['bottom'].set_position(('axes', 0.2)) #指定 data 设置的bottom(也就是指定的x轴)绑定到y轴的20%处
plt.plot(x, y, marker='o', label='直线')
plt.plot(x, y1, color='r', linestyle='--', marker='>', label='曲线')
# 调用 plt.legend() 绘制出一个图例。plt.legend() 需要传入一个位置值
plt.legend(loc='best')
plt.show() # 展示
loc的取值
有时某些数据点非常关键,需要突显出来。我们需要将该点绘制出来,即绘制散点图,再对其做注释。实现上述需求,我们要用到scatter()
和annotate()
函数。scatter()
是用于绘制散点图,这里我们只是用其来绘制单个点。scatter()
用法,后续文章会详细对其用法做说明。annotate()
则是添加标注 。 scatter() 函数必须传入两个参数 x 和 y。值得注意得是,它们的数据类型是列表。x 代表要标注点的横轴位置,y 代表要标注点的横轴位置。x 和 y 列表中下标相同的数据是对应的。例如 x 为 [3, 4],y 为 [6, 8],这表示会绘制点(3,6),(4, 8)。因此,x 和 y 长度要一样。 annotate函数同样也有两个必传参数,一个是标注内容,另一个是 xy。标注内容是一个字符串。xy 表示要在哪个位置(点)显示标注内容。xy 位置地选定。一般是在scatter() 绘制点附近,但不建议重合,这样会影响美观。
x = np.arange(-5, 5, 0.5)
y1 = x ** 2 + 5
fig = plt.figure()
plt.rcParams['font.sans-serif'] = ['SimHei'] # 设置显示中文
plt.rcParams['axes.unicode_minus'] = False ## 防止坐标轴上的"-"号变为方块
# 设置坐标轴标签
plt.xlabel("X 轴")
plt.ylabel("Y 轴")
# 设置精准刻度
# xticks() 和 yticks() 需要传入一个列表作为参数。
plt.xticks(np.arange(-5, 5, 1))
plt.yticks(np.arange(-20, 30, 5))
plt.plot(x, y1, color='r', label='曲线')
# 调用 plt.legend() 绘制出一个图例。plt.legend() 需要传入一个位置值
plt.legend(loc='best')
x0 = 0
y0 = x0 ** 2 + 5
plt.scatter(x0, y0, s=50, color='b')
plt.annotate('极小值点',
xy=(x0, y0),
xycoords='data',
xytext=(+10, +30),
textcoords='offset points',
arrowprops=dict(arrowstyle='->', connectionstyle="arc3,rad=.2")
)
# 如果你还想给点添加注释。这需要使用text()函数。text(x,y,s) 作用是在点(x,y) 上添加文本 s
plt.text(-3.7, 25, r'$This\ is\ the\ some\ text. \mu\ \sigma_i\ \alpha_t$',
fontdict={'size': 16, 'color': 'r'})
plt.show() # 展示
x = np.linspace(-3, 3, 50)
y = 0.1 * x
plt.figure()
plt.plot(x, y, linewidth=10, zorder=1) # set zorder for ordering the plot in plt 2.0.2 or higher
plt.ylim(-2, 2)
ax = plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data', 0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data', 0))
for label in ax.get_xticklabels() + ax.get_yticklabels():
label.set_fontsize(12)
# set zorder for ordering the plot in plt 2.0.2 or higher
label.set_bbox(dict(facecolor='white', edgecolor='none', alpha=0.8, zorder=2))
plt.show()
# 散点图
def figureScatter():
x = np.random.randn(1000)
y = -x + np.random.randn(1000) * 0.5
plt.scatter(x, y,
s=30,
c='g',
marker='*',
alpha=0.3 # 透明度
)
plt.show()
def figureBar():
n = 10
x = np.arange(n)
y1 = 3 * x + 1
y2 = -2 * x - 1
p1 = plt.bar(x, y1, color='r', width=0.8)
p2 = plt.bar(x, y2, color='g', width=0.8)
plt.xlabel("X")
plt.ylabel("Y")
plt.title("bar", fontsize="18")
ax = plt.gca()
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position(('data', 0))
for xt, yt in zip(x, y1):
plt.text(xt, yt + 0.5,'%s' %yt, ha='center', va='bottom')
for xt, yt in zip(x, y2):
plt.text(xt, yt - 0.8,'%s' %yt, ha='center', va='top')
plt.show()
热图(heatmap)是数据分析的常用方法,通过色差、亮度来展示数据的差异、易于理解。Python在Matplotlib库中,调用imshow()函数实现热图绘制。
points = np.arange(-5, 5, 0.01)
xs, ys = np.meshgrid(points, points)
z = np.sqrt(xs ** 2 + ys ** 2)
# 创建新的figure
fig = plt.figure()
# 绘制2x2两行两列共四个图,编号从1开始
ax = fig.add_subplot(221)
ax.imshow(z)
ax = fig.add_subplot(222)
# 使用自定义的colormap(灰度图)
ax.imshow(z, cmap=plt.cm.gray)
ax = fig.add_subplot(223)
# 使用自定义的colormap
ax.imshow(z, cmap=plt.cm.cool)
ax = fig.add_subplot(224)
# 使用自定义的colormap
ax.imshow(z, cmap=plt.cm.hot)
# 图片的显示
plt.show()
def figureImg():
# image data
a = np.array([0.313660827978, 0.365348418405, 0.423733120134,
0.365348418405, 0.439599930621, 0.525083754405,
0.423733120134, 0.525083754405, 0.651536351379]).reshape(3, 3)
"""
for the value of "interpolation", check this:
http://matplotlib.org/examples/images_contours_and_fields/interpolation_methods.html
for the value of "origin"= ['upper', 'lower'], check this:
http://matplotlib.org/examples/pylab_examples/image_origin.html
"""
plt.imshow(a, interpolation='nearest', cmap='bone', origin='lower')
plt.colorbar(shrink=.92)
plt.xticks(())
plt.yticks(())
plt.show()