可视化是在整个数据挖掘的关键辅助工具,可以清晰的理解数据,从而调整我们的分析方法
1.能使数据进行可视化、更直观的呈现
2.使数据更加客观、更具说服力
from matplotlib import pyplot as plt
# 创建画布
plt.figure(figsize=(10,10),dpi=100)
# 指定x、y数据
x = [1,2,3,4,5,6,7,8]
y = [1,4,9,16,25,36,49,64]
# 绘制图像
plt.plot(x,y)
# 保存图像
plt.savefig(r"C:\Users\admin\Desktop\picture\test.png")
# 显示图像
plt.show()
figsize:指定画布大小尺寸
dpi:图像清晰度
注意:保存图片要在显示图像账号之前 因为plt.show()会释放资源,如果保存图片步骤在显示图片步骤之后,那么保存的图片是空白的
容器层主要由Canvas、Figure、Axes组成。
Canvas是位于最底层的系统层,在绘图的过程中充当画板的角色,即放置画布(Figure)的工具。
Figure是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。
Axes是应用层的第二层,在绘图的过程中相当于画布上的绘图区的角色。
Figure:指整个图形(可以通过plt.figure()设置画布的大小和分辨率等)
Axes(坐标系):数据的绘图区域
Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签
特点为:
一个figure(图像)可以包含多个axes(坐标系/绘图区),但是一个axes只能属于一个figure。
一个axes(坐标系/绘图区)可以包含多个axis(坐标轴),包含两个即为2d坐标系,3个即为3d坐标系
辅助显示层为Axes(绘图区)内的除了根据数据绘制出的图像以外的内容,主要包括Axes外观(facecolor)、边框线(spines)、坐标轴(axis)、坐标轴名称(axis label)、坐标轴刻度(tick)、坐标轴刻度标签(tick label)、网格线(grid)、图例(legend)、标题(title)等内容。
该层的设置可使图像显示更加直观更加容易被用户理解,但又不会对图像产生实质的影响。
图像层指Axes内通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。
总结:
Canvas(画板)位于最底层,用户一般接触不到
Figure(画布)建立在Canvas之上
Axes(绘图区)建立在Figure之上
坐标轴(axis)、图例(legend)等辅助显示层以及图像层都是建立在Axes之上
from matplotlib import pyplot as plt
import random
# 创建画布
plt.figure(figsize=(20,20),dpi=80)
# 指定x,y数据
x = range(60)
y = [random.uniform(8,11) for i in x]
y_second = [random.uniform(14,18) for i in x]
# 绘制图形,如有要绘制多条数据,直接plt.plot()就可以了
plt.plot(x,y,label="first",color="r",linestyle="--")
plt.plot(x,y_second,label="second")
# 自定义x、y坐标轴刻度 注:此步骤要再绘制图像之后,要不没效果
x_labels_ticks = ["11:{}".format(i) for i in x]
y_labels_ticks = range(40)
plt.xticks(x[::5],x_labels_ticks[::5])
plt.yticks(y_labels_ticks[::5])
# 添加网格线
plt.grid(linestyle="--",alpha=0.5)
# 添加描述信息
plt.xlabel("time",fontsize=16)
plt.ylabel("temperature",fontsize=16)
plt.title("time-temperature relation",fontsize=28)
# 保存图片 注意:保存图片要在显示图像账号之前 因为plt.show()会释放资源,如果保存图片步骤在显示图片步骤之后,那么保存的图片是空白的
plt.savefig("./test.png")
# 增加图例
plt.legend(loc="best")
# 显示图像
plt.show()
plt.xticks(x,**kwargs) x:要显示的刻度值
plt.yticks(y,**kwargs) y:要显示的刻度值
下载中文字体(黑体,看准系统版本)
下载 SimHei 字体(或者其他的支持中文显示的字体也行)
安装字体
linux下:拷贝字体到 usr/share/fonts 下:
sudo cp ~/SimHei.ttf /usr/share/fonts/SimHei.ttf
windows和mac下:双击安装
删除~/.matplotlib中的缓存文件
cd ~/.matplotlib
rm -r *
修改配置文件matplotlibrc
vi ~/.matplotlib/matplotlibrc
将文件内容修改为:
font.family : sans-serif
font.sans-serif : SimHei
axes.unicode_minus : False
plt.plot(x,y,label="first",color="r",linestyle="--")
显示图例
注意:在plt.plot()处设置label是不能显示出图例的,还需要plt.legend()将图例显示出来
plt.legend(loc="best")
例:画出一小时内(60min)结点随时间的位置变化折线图
使用matplotlib.pyplot.subplots(nrows=1, ncols=1, **fig_kw) 方法创建一个带有多个axes(坐标系/绘图区)的图
from matplotlib import pyplot as plt
import random
# 多个axes(字坐标系)
# 数据
x = range(60)
y_locationone = [random.uniform(10,20) for i in x]
y_locationtwo = [random.uniform(20,30) for i in x]
# 创建画布
fig,axes = plt.subplots(nrows=1,ncols=2,figsize=(20,10),dpi=100)
# 绘制图像
axes[0].plot(x,y_locationone,label = "first")
axes[1].plot(x,y_locationtwo,label = "second")
# 添加x、y自定义刻度
x_ticks = ["{}min".format(i) for i in x]
y_ticks = range(40)
axes[0].set_xticks(x[::5],x_ticks[::5])
axes[0].set_yticks(y_ticks[::5])
axes[1].set_xticks(x[::5],x_ticks[::5])
axes[1].set_yticks(y_ticks[::5])
# 添加网格显示
axes[0].grid(True,linestyle="--",alpha=0.5)
axes[1].grid(True,linestyle="--",alpha=1)
# 添加x、y轴描述和标题
axes[0].set_xlabel("time")
axes[0].set_ylabel("location")
axes[0].set_title("Time--Location Relation",fontsize = 25)
axes[1].set_xlabel("time")
axes[1].set_ylabel("location")
axes[1].set_title("Time--Location Relation",fontsize = 25)
# 增加图例
axes[0].legend(loc=0)
axes[1].legend(loc=0)
# 显示图像
plt.show()
from matplotlib import pyplot as plt
import numpy as np
x = np.linspace(-10,10,1000)
y = np.sin(x)
plt.figure(figsize=(20,20),dpi=100)
plt.plot(x,y)
plt.grid()
plt.show()
Matplotlib 能够绘制折线图、散点图、柱状图、直方图、饼图等待
api:plt.plot(x, y)
以折线的上升或者下降来表示统计数量的增加或者减少的统计图
特点:能够显示数据的变化趋势,反映事物的变换情况
折线图在上面的例子中已经绘制过,这里就不再一一阐述
用两组数据构成多个坐标点,考察坐标点的分布,判断两个变量之间是否存在某种关联或总结坐标点的分布模式
api:plt.scatter(x, y)
特点:判断变量之间是否存在数量关联趋势,展示分布规律(离群点)
如下例子,趋于回归
from matplotlib import pyplot as plt
# 0.准备数据
# x 房子面积
x = [225.98, 247.07, 253.14, 457.85, 241.58, 301.01, 20.67, 288.64,
163.56, 120.06, 207.83, 342.75, 147.9 , 53.06, 224.72, 29.51,
21.61, 483.21, 245.25, 399.25, 343.35]
# y 房子价钱
y = [196.63, 203.88, 210.75, 372.74, 202.41, 247.61, 24.9 , 239.34,
140.32, 104.15, 176.84, 288.23, 128.79, 49.64, 191.74, 33.1 ,
30.74, 400.02, 205.35, 330.64, 283.45]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制散点图
plt.scatter(x, y)
plt.savefig(r"C:\Users\admin\Desktop\picture\1122.png")
# 3.显示图像
plt.show()
排列在工作表的列或行中的数据可以绘制到柱状图中
特点:绘制离散的数据,能够一眼看出各数据的大小 ,比较数据之间的差别
api:plt.bar(x, width, align='center', **kwargs)
Parameters:
x : sequence of scalars.
width : scalar or array-like, optional
柱状图的宽度
align : {‘center’, ‘edge’}, optional, default: ‘center’
Alignment of the bars to the x coordinates:
‘center’: Center the base on the x positions.
‘edge’: Align the left edges of the bars with the x positions.
每个柱状图的位置对齐方式
**kwargs :
color:选择柱状图的颜色
from matplotlib import pyplot as plt
import random
# 0.准备数据
num = ['one','two','three','four','five','six','seven','eight','nine','ten','eleven']
# 横坐标
x = range(len(num))
# 数据
y = [73853,57767,22354,15969,14839,8725,8716,8318,7916,6764,52222]
# 1.创建画布
plt.figure(figsize=(20, 8), dpi=100)
# 2.绘制柱状图
plt.bar(x, y, width=0.5, color=['b','r','g','y','c','m','y','k','c','g','b'])
# 2.1b修改x轴的刻度显示
plt.xticks(x, num)
# 2.2 添加网格显示
plt.grid(linestyle="--", alpha=0.5)
# 2.3 添加标题
plt.title("Histogram")
# 3.显示图像
plt.show()
由一系列高度不等的纵向条纹或线段表示数据分布的情况。 一般用横轴表示数据范围,纵轴表示分布情况。
特点:绘制连续性的数据展示一组或者多组数据的分布状况(统计)
api:matplotlib.pyplot.hist(x, bins=None)
Parameters:
x : (n,) array or sequence of (n,) arrays
bins : integer or sequence or ‘auto’, optional
组距
用于表示不同分类的占比情况,通过弧度大小来对比各种分类。
特点:分类数据的占比情况(占比)
api:plt.pie(x, labels=,autopct=,colors)
x:数量,自动算百分比
labels:每部分名称
autopct:占比显示指定%1.2f%%
colors:每部分颜色
https://matplotlib.org/gallery/index.html