1. 数据可视化是什么?
顾名思义,数据可视化就是将数据转换成图或表等,以一种更直观的方式展现和呈现数据。通过“可视化”的方式,我们看不懂的数据通过图形化的手段进行有效地表达,准确高效、简洁全面地传递某种信息,甚至帮助我们发现某种规律和特征,挖掘数据背后的价值。
图表为更好地探索、分析数据提供了一种直观的方法,它对最终分析结果的展示具有重要的作用。
柱状图=条形图 直方图=特殊的条形图
2. Matplotlib是什么?
是一款用于数据可视化的 Python 软件包,支持跨平台运行,它能够根据 NumPy ndarray 数组来绘制 2D(3D) 图像,它使用简单、代码清晰易懂,深受广大技术爱好者喜爱。
优点:
- Matplotlib 提供了一个套面向绘图对象编程的 API 接口
- 依托于Python,借助Python的强大的可拓展性,Matplotlib可以在许多不同的环境中被使用
- 基于Matlab的和基于面向对象的,但是它完全免费(Matlab是商业数学软件)
- Matplotlib 实现了几乎是完全自主控制的图形定义功能
3. Matplotlib下载和安装
使用pip理器安装
pip install matplotlib
使用Anaconda安装(安装了anaconda不用重复安装matplotlib)
验证安装
>import matplotlib
>matplotlib.__version__
4. 第一个Matplotlib绘图程序
首先导入 Matplotlib 包中的 Pyplot 模块
import matplotlib.pyplot as plt
接下来,使用 NumPy 提供的函数 arange() 创建一组数据来绘制图像。
# 引入numpy包
import numpy as np
# 获得0到50之间的ndarray对象
x = np.arange(0, 50)
上述所得 x 的值作用到 x 轴上,而该值的平方值,也就是 y 值,使用以下方式获取
y = x **2
使用 plot() 函数对 x、y 进行绘制。
plt.plot(x,y)
注意:当x,y维度不一致时,会报错:
x = [1,2,3,4]
y = [1,2,3]
plt.plot(x,y)
ValueError: x and y must have same first dimension, but have shapes (4,) and (3,)
5. matplotlib的基本方法
图表名称 plt.title()
# 设置图表的名称
plt.title("y= x^2")
如果将图表名称设置为中文则会报错
因为默认不支持中文:missing from current font 字体丢失
解决方案:修改字体配置 plt.rcParams["font.sans-serif"]
# 使用中文需要进行配置信息的设置 字体设置时,字体名称不区别大小写
plt.rcParams['font.sans-serif'] = ["FangSong"]
plt.title("y等于x的平方")
设置了中文字体后,负数又没办法正确显示了
解决方案:当字体设置支持中文后,必须设置负号,否则当数值中出现负值时,负号无法正常显示
# 解决方式: 修改轴中的负号编码
plt.rcParams['axes.unicode_minus'] = False
x轴和y轴名称 xlabel() ylabel()
# 创建x为-10到10的整数
x = np.arange(-10,10)
# y是x的平方
y = x ** 2
# 设置标题
plt.title('y=x^2 x取值范围为:[-10,10)')
# 设置x轴名称
plt.xlabel("x 轴")
# 设置y轴名称
plt.ylabel("y 轴")
plt.plot(x, y)
对于上面的图,如果觉得字体偏小或线条太细,可以设置标签文字大小和线条粗细
fontsize参数: 设置文字大小
linewidth参数: 设置线条
# 设置标题
plt.title('y=x^2 x取值范围为:[-10,10)',fontsize=16)
# 设置x轴名称 ,值不能写"12px"
plt.xlabel("x 轴",fontsize=12)
# 设置y轴名称
plt.ylabel("y 轴")
plt.plot(x, y,linewidth=5)
# 我们可以在一张图片中绘制多个线条
# 创建x为-10到10的整数
x = np.arange(-10,10)
# y1是x的平方
y1 = x ** 2
# y2等于x
y2 = x
# 设置标题
plt.title('y=x^2 x取值范围为:[-10,10)',fontsize=16)
# 设置x轴名称
plt.xlabel("x 轴",fontsize=12)
# 设置y轴名称
plt.ylabel("y 轴")
# 绘图线条1
plt.plot(x, y1)
# 绘图线条2
plt.plot(x, y2)
设置x轴和y轴的刻度 xticks() yticks()
matplotlib.pyplot.xticks(ticks=None, labels=None, **kwargs)
matplotlib.pyplot.yticks(ticks=None, labels=None, **kwargs)
- ticks: 此参数是xtick位置的列表,即需要显示的x轴刻度索引。和一个可选参数。如果将一个空列表作为参数传递,则它将删除所有xticks
- label: 此参数包含放置在给定刻度线位置的标签。它是一个可选参数。,
- **kwargs:此参数是文本属性,用于控制标签的外观
- rotation:旋转角度 如:rotation=45
- color:颜色 如:color="red"
xticks到底有什么用,其实就是想把坐标轴变成自己想要的样子
# 每个时间点的销量绘图,如果x轴的数据是字符串,会将数据全部展示
times = ['2015/6/26', '2015/8/1', '2015/9/6', '2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','2016/4/9',
'2016/5/15','2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
# 随机出销量
sales =np.random.randint(500,2000,size=len(times))
# 如果想只显示部分时间,或者按照某个规则展示,如何处理,这个时候就用到xticks
plt.xticks(range(0,len(times),2))
plt.plot(times,sales)
# 时间虽然少了,可不可以让横坐标中的字体倾斜,就可以放下了.
# xticks 第一个参数中元素的值,代表原始数据的索引
plt.xticks(range(0,len(times),2),labels=['日期:%s'%times[i] for i in range(0,len(times),2)], rotation=45, color='red')
plt.plot(times,sales)
第一个参数 需要一个数字列表,指示x轴上的记号应该指向哪里,您向这个函数传递了一个字符串,它不知道如何将其转换为x轴上的位置。
1. 当x轴是数值型数据,绘图会自动分割
# 日期从1991年到2020 ,30年的日期
dates = np.arange(1991,2021)
# 使用numpy随机生成销量
sales = np.random.randint(50,500,size=30)
# 绘制销量图:
plt.plot(dates,sales)
# 如果想按照自己的逻辑分割,注意数值型对应轴上面的数值,比如:
plt.xticks([1980,1982,1993]) # 当前会看到x轴上面没有数据,其实是有数据,只不过,默认当前图形的x轴区间是1991,2021
# 可以借助设置%matplotlib notebook,移动图像来查看
# 绘制销量图:
plt.plot(dates,sales)
# 如果想按照自己的逻辑分割,注意数值型使用的是元素本身,而不是元素的索引
plt.xticks([1990,2005,2010,2020]) # 元素本身
plt.plot(dates,sales)
plt.xticks(np.arange(dates.min(),dates.max()+2,2),rotation=45)
# 绘制销量图:
plt.plot(dates,sales)
2. x轴是字符串类型
# 如果还是x轴想间隔指定个数
# 1. 将x轴更改为字符串
# 日期从1991年到2020 ,30年的日期
dates = np.arange(1991,2021).astype(np.str_)
# xticks 第一个参数中元素不能是字符串
plt.xticks(range(1,len(dates),2),rotation=45) # 元素本身
# 绘制销量图:
plt.plot(dates,sales)
总结:
-
x轴是数值型,会按照数值型本身作为x轴的坐标
-
x轴为字符串类型,会按照索引作为x轴的坐标
显示图表show()
- 显示所有打开的图形。
jupyter notebooks会自动显示图形
plt.show()
# 如果在jupyter中也想出现图形操作菜单,可以使用matplotlib中的魔术方法
%matplotlib notebook
则会出现
# 如果想回去原先的展示,使用另一个 %matplotlib inline
%matplotlib inline
图例 legend()
图例是集中于地图一角或一侧的地图上各种符号和颜色所代表内容与指标的说明,有助于更好的认识地图。
# 每个时间点的销量绘图
times = ['2015/6/26', '2015/8/1', '2015/9/6', '2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','2016/4/9',
'2016/5/15','2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
# 随机出收入
income =np.random.randint(500,2000,size=len(times))
# 支出
expenses =np.random.randint(300,1500,size=len(times))
# 绘制图形
plt.xticks(range(1,len(times),2),rotation=45)
# 注意,在使用图例前为每个图形设置label参数
plt.plot(times,income,label="收入")
plt.plot(times,expenses,label="支出")
# 默认会使用每个图形的label值作为图例中的说明
plt.legend()
图例位置设置
- loc代表了图例在整个坐标轴平面中的位置(一般选取'best'这个参数值)
- 第一种:默认是"best",图例自动‘安家’在一个坐标面内的数据图表最少的位置
- 第二种: loc = 'XXX' 分别有0: ‘best’ (自动寻找最好的位置)
显示每条数据的值 x,y值的位置 text()
plt.text(x,y, string, fontsize=15, verticalalignment="top", horizontalalignment="right")
- x,y:表示坐标值上的值
- string:表示说明文字
- fontsize:表示字体大小
- verticalalignment:(va)垂直对齐方式 ,参数:[ ‘center’ | ‘top’ | ‘bottom’ | ‘baseline’ ]
- horizontalalignment:(ha)水平对齐方式 ,参数:[ ‘center’ | ‘right’ | ‘left’ ]
# 每个时间点的销量绘图
times = ['2015/6/26', '2015/8/1', '2015/9/6', '2015/10/12', '2015/11/17','2015/12/23','2016/1/28','2016/3/4','2016/4/9',
'2016/5/15','2016/6/20','2016/7/26','2016/8/31','2016/10/6','2016/11/11','2016/12/17']
# 随机出收入
income =np.random.randint(500,2000,size=len(times))
# 支出
expenses =np.random.randint(300,1500,size=len(times))
# 绘制图形
plt.xticks(range(1,len(times),2),rotation=45)
# 注意,在使用图例前为每个图形设置label参数
plt.plot(times,income,label="收入")
plt.plot(times,expenses,label="支出")
# 默认会使用每个图形的label值作为图例中的说明
plt.legend(loc="upper left")
for x,y in zip(times,income):
plt.text(x,y,'%s万'%y)
for a,b in zip(times,expenses):
plt.text(a,b,b)