Jupyter Notebook 常用快捷键:
-
两种模式通用快捷键:
Shift+Enter,执行本单元,并跳转到下一单元。
Ctrl+Enter,执行本单元,留在本单元。
-
命令模式:按ESC进入。
- Y,cell切换到Code模式
- M,cell切换到Markdown模式
- A,在当前cell的上面添加cell
- B,在当前cell的下面添加cell
- Z,回退
- L,为当前cell加上行号
- 双击D,删除当前cell
- Ctrl+Shift+P,对话框输入命令直接运行
- Ctrl+Home,跳转到首个cell
- Ctrl+End,跳转到最后一个cell
-
编辑模式:按Enter进入。
- 多光标操作:按住Ctrl键,点击鼠标
- 回退:Ctrl+Z
- 重做:Ctrl+Y
- 补全代码:变量、方法后跟Tab键
- 注释:Ctrl+/
- 屏蔽自动输出消息:可在最后一条语句后加;
1. Matplotlib
为什么要使用Matplotlib?
- 数据可视化 – 绘制二维图表(三维图也可),帮助理解数据,方便选择更合适的分析方法;
- js库更能胜任交互式的数据可视化 – D3, echarts;
- 奥卡姆剃刀原理 – 如无必要勿增实体,能够满足自身需要即可。
1.1 Matplotlib图像结构
1.2 Matplotlib 三层结构
-
容器层:主要由Canvas、Figure、Axes组成。
画板层(Canvas):是位于最底层的系统层,在绘图中充当画板的角色,即放置画布(Figure)的工具。
画布层(Figure):是Canvas上方的第一层,也是需要用户来操作的应用层的第一层,在绘图的过程中充当画布的角色。
绘图区/坐标系(Axes):plt.subplots();是应用的第二层,在绘图的过程中相当于画布上的绘图区的角色。- Figure:指整个图形(可以通过plt.figure()设置画布的大小和分辨率等)
- Axes(坐标系):数据的绘图区域
- Axis(坐标轴):坐标系中的一条轴,包含大小限制、刻度和刻度标签
特点为:
- 一个figure(画布)可以包含多个axes(坐标系/绘图区),但是一个axes只能属于一个figure。
- 一个axes(坐标系/绘图区)可以包含多个axis,包含两个即为2d坐标系,3个即为3d坐标系。
-
辅助显示层
-
图像层:指通过plot、scatter、bar、histogram、pie等函数根据数据绘制出的图像。
图例等辅助显示层以及图像层都是建立在Axes之上。
2. 折线图(plot)与基础绘图功能
matplotlib.pyplot包含了一系列的类似于matlib的画图函数,他的函数作用于当前函数图形(figure)的当前坐标系(axes)。
- 基本语法
# 1.创建画布
plt.figure()
# 2.绘制图像
plt.plot()
# 3.显示图像
plt.show()
- 设置画布属性
plt.figure(figsize=(20,8), dpi=140)
- figsize:画布大小,指定长宽。
- dpi:清晰度,每一英寸有多少个点(dot per inch)。
- 保存图像
plt.savefig('name.png')
注意:该语句应放在plt.show()之前,否则保存的图像为空白。因为plt.show()会释放figure资源。
- 修改x、y轴刻度
'''实例:画出某城市11点到12点一小时内每分钟的温度变化折线图,温度范围在15~18°C。'''
import random
# 1.准备数据
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # uniform表示随机生成的数据为均匀分布。
# 2.创建画布
plt.figure(figsize=(20,8), dpi=140)
# 3.绘制图像
plt.plot(x,y_shanghai)
# 4.显示图像
plt.show()
显示结果:
- 修改x,y轴刻度信息
# 设置x轴的刻度信息
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5]) # 注意保证步长一一对应
plt.yticks(range(0, 40, 5)) # 设置y坐标轴显示步长
# plt.yticks(range(40)[::5]) 同样的功能
注意!解决win10系统matplotlib中文字体不显示问题:
方法一:
2. 1)放置字体
下载字体:Microsoft JhengHei.ttf;提取码:03bu。
放置字体:将字体Microsoft JhengHei.ttf
放在盘符:\anaconda安装路径\Lib\site-packages\matplotlib\mpl-data\fonts\ttf
路径下。如果实在某一虚拟环境中使用matplotlib,应该移动到对应环境下的该目录。
- 2)删除matplotlib缓存文件
删除C:\Users\用户名
路径下的.matplotlib
文件 - 3)程序中使用
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] # 中文字体设置
plt.rcParams['axes.unicode_minus'] = False
为了修复不显示中文的问题,试了修改配置文件的方法,但是不起作用。于是,在程序中输入以上语句后,成功显示中文字体。注意!程序中字体设置的名称,应该为字体文件.ttf
中的名称!并且相应的文件名也应该修改。如图所示:
方法二:
from matplotlib.font_manager import FontProperties
my_font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf',size=15)
#需要设置中文时,添加fontproperties参数
plt.xticks(fontproperties=my_font)
#seaborn中文显示
sns.set(font=myfont.get_name())
- 添加网格显示
plt.grid(linestyle = "--", alpha = 0.5)
- 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("某城市11点到12点一小时内每分钟的温度变化折线图")
- 添加折线
y_beijing = [random.uniform(1,3) for i in x]
plt.plot(x, y_beijing)
- 修改图形颜色和风格
plt.plot(x, y_beijing, color = 'r', linestyle = '--')
颜色字符 | 风格字符 |
---|---|
r 红色 | - 实线 |
g 绿色 | – 虚线 |
b 蓝色 | -. 点划线 |
w 白色 | : 点虚线 |
c 青色 | ’ ’ 留空、空格 |
m 洋红 | |
y 黄色 | |
k 黑色 |
- 设置图例
plt.plot(x,y_shanghai, label = '上海')
plt.plot(x, y_beijing, color = 'r', linestyle = '--', label = '北京')
# 显示图例
plt.legend(loc = 'best')
Location String | Location Code |
---|---|
‘best’ | 0 |
‘upper right’ | 1 |
‘upper left’ | 2 |
‘lower left’ | 3 |
‘lower right’ | 4 |
‘right’ | 5 |
‘center left’ | 6 |
以上完整代码:
import matplotlib.pyplot as plt
import random
#Ipython中的魔法函数,直接在python console里绘图
%matplotlib inline
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] # 中文字体设置
plt.rcParams['axes.unicode_minus'] = False
# 1.构造输入
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # uniform表示随机生成的数据为均匀分布。
y_beijing = [random.uniform(1,3) for i in x]
# 2.创建画布
plt.figure(figsize=(20,8), dpi=140)
# 3.绘图
#plt.plot(x,y_shanghai)
#plt.plot(x, y_beijing)
plt.plot(x,y_shanghai, label = '上海')
plt.plot(x, y_beijing, color = 'r', linestyle = '--', label = '北京')
# 显示图例
plt.legend(loc = 'best')
# 修改x,y轴刻度信息
x_label = ["11点{}分".format(i) for i in x]
plt.xticks(x[::5], x_label[::5]) # 注意保证步长一一对应
plt.yticks(range(0, 40, 5)) # 设置y坐标轴显示步长
# 添加网格显示
plt.grid(linestyle = "--", alpha = 0.5)
# 添加描述信息
plt.xlabel("时间")
plt.ylabel("温度")
plt.title("某城市11点到12点一小时内每分钟的温度变化折线图")
# 保存图像
plt.savefig('03-2.png')
# 4.显示
plt.show()
输出结果:
- 创建多个绘图区
matplotlib.pyplot.subplots(nrows=1, ncols=1, sharex=False, sharey=False, \
squeeze=True, subplot_kw=None, gridspec_kw=None, **fig_kw)
nrows, ncolsint, optional, default: 1
Number of rows/columns of the subplot grid.
sharex, shareybool or {‘none’, ‘all’, ‘row’, ‘col’}, default: False
Controls sharing of properties among x (sharex) or y (sharey) axes:
- True or ‘all’: x- or y-axis will be shared among all subplots.
- False or ‘none’: each subplot x- or y-axis will be independent.
- ‘row’: each subplot row will share an x- or y-axis.
- ‘col’: each subplot column will share an x- or y-axis.
具体可参考官方文档说明
plt.subplots() 返回值:
figure, axes = plt.subplots(nrows = 1, ncols = 2, **fig_kw)
完整代码:
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] # 中文字体设置
plt.rcParams['axes.unicode_minus'] = False
# 1.构造输入
x = range(60)
y_shanghai = [random.uniform(15,18) for i in x] # uniform表示随机生成的数据为均匀分布。
y_beijing = [random.uniform(1,3) for i in x]
# 2.创建画布
#plt.figure(figsize=(20,8), dpi=140)
figure, axes = plt.subplots(nrows=1, ncols=2, figsize=(20,8), dpi=140)
# 3.绘图
axes[0].plot(x,y_shanghai, label='上海')
axes[1].plot(x, y_beijing, color='r', linestyle='--', label='北京')
# 显示图例
axes[0].legend()
axes[1].legend()
# 修改x,y轴刻度信息
x_label = ["11点{}分".format(i) for i in x]
axes[0].set_xticks(x[::5]) #设置x坐标轴显示步长
axes[0].set_xticklabels(x_label)
axes[0].set_yticks(range(0, 40, 5)) #设置y坐标轴显示步长
axes[1].set_xticklabels(x_label)
axes[1].set_xticks(x[::5])
axes[1].set_yticks(range(0, 40, 5))
# 添加网格显示
axes[0].grid(linestyle = "--", alpha = 0.5)
axes[1].grid(linestyle = "--", alpha = 0.5)
# 添加描述信息
axes[0].set_xlabel("时间")
axes[0].set_ylabel("温度")
axes[0].set_title("上海11点到12点一小时内每分钟的温度变化折线图")
axes[1].set_xlabel("时间")
axes[1].set_ylabel("温度")
axes[1].set_title("北京11点到12点一小时内每分钟的温度变化折线图")
# 保存图像
plt.savefig('03-3.png')
# 4.显示
plt.show()
输出结果:
- 数学函数:
# 1.准备数据
import numpy as np
x = np.linspace(-1,1,1000)
y = 2 * x * x
# 2.创建画布
plt.figure(figsize=(20,8),dpi=80)
# 3.绘制图像
plt.plot(x,y)
# 网格显示
plt.grid(linestyle='--', alpha = 0.5)
# 4.显示图像
plt.show()
3. 散点图
- 常见图形种类及意义:
- 折线图plot:数据变化趋势
- 散点图scatter:数据之间的关系/规律
- 柱状图bar:数据统计/对比
- 直方图histogram:反应一组连续数据的分布状况
- 饼图pie:占比
- 散点图
matplotlib.pyplot.scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, verts=<deprecated parameter>, edgecolors=None, *, plotnonfinite=False, data=None, **kwargs)[source]
具体可参考官方文档。
4.柱状图
matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)[source]
具体可参考官方文档。
实例:
#1.准备数据
movie_names = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','战狼2']
tickets = [73853,57767,22354,15969,14839,8725,8716,88521]
#2.创建画布
plt.figure(figsize=(20,8), dpi=140)
#3.绘制柱状图
x_ticks = range(len(movie_names))
plt.bar(x_ticks, tickets, color=['b','r','g','c','m','y','k','b'],label='全球票房')
#修改x刻度
plt.xticks(x_ticks, movie_names, size=20)
#添加网格
plt.grid(linestyle='--', alpha=0.5)
#添加标题
plt.title('电影票房对比',size=30)
#设置坐标轴信息
plt.xlabel('电影',size=20)
plt.ylabel('票房/美元',size=20)
#保存图像
plt.savefig('03-4.png')
#显示图像
plt.show()
输出结果:
需求2:对比
#1.准备数据
movie_name = ['雷神3:诸神黄昏','正义联盟','寻梦环游记']
first_day = [10587.6,10062.5,1275.7]
first_weekend = [36224.9, 34479.6, 11830]
#2.创建画布
plt.figure(figsize=(20,8), dpi=80)
#3.绘制柱状图
x = range(len(movie_name))
plt.bar(x,first_day, width=0.2, label='首日票房')
plt.bar([i+0.2 for i in x], first_weekend, width=0.2, label='首周票房')
#添加网格
plt.grid(linestyle='--', alpha=0.5)
#显示图例
plt.legend()
#修改刻度
plt.xticks([i+0.1 for i in x], movie_name, size=20)
#保存图像
plt.savefig('03-5.png')
#4.显示图像
plt.show()
输出结果:
4.直方图
直方图设计统计学的概念,首先要对数据进行分组,然后统计每个分组内数据元的数量。在坐标系中,横轴标出每个组的端点,纵轴表示频数,每个矩形的高代表对应的频数,称这样的统计图为频数分布直方图。
组数:在统计数据时,我们把数据按照不同的范围分成几组,分成的组的个数成为组数。
组距:每一组两个端点的差。
直方图描述的是一组数据的频次分布,是以矩形的长度表示每一组的频数或数量,宽度则表示各组的组距,因此其高度与宽度均有意义,利于展示大量数据集的统计结果。直方图有助于帮助我们指导数据的分布情况,诸如众数、中位数的大致位置、数据是否存在缺口或者异常值。
4.1 直方图与柱状图的区别
- **直方图展示数据的分布、柱状图比较数据的大小。**这是直方图和柱状图的本质区别。
- **直方图X轴为定量数据,柱状图X轴为分类数据。**直方图上的每根柱子是不可移动的,X轴上的区间是连续的、固定的。而柱状图上的每根柱子是可以随意排序的。
- 直方图柱子间无间隔,柱状圆柱子有间隔。
- 直方图柱子宽度可不一,柱状图柱子宽度必须 一致。
4.2 直方图绘制
matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False, *, data=None, **kwargs)
常用参数:
- x:输入值
- bins:组数
#1.准备数据
time = [131,98,125,131,124,139,131,117,128,135,138,131,102,107,114,119,121,136,132,117]
#2.创建画布
plt.figure(figsize=(20,8), dpi=140)
#3.绘制直方图
distance = 2
group_num = int((max(time) - min(time)) / distance)
plt.hist(time, bins=group_num, normed=True)
plt.grid(linestyle='--',alpha=0.5)
#修改x轴刻度
plt.xticks(range(min(time),max(time)+2, distance))
#4.显示图像
plt.show()
注意:y轴所代表的的变量。可以是频次,也可以是频率。
5.饼图
matplotlib.pyplot.pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.6, shadow=False, labeldistance=1.1, startangle=None, radius=None, counterclock=True, wedgeprops=None, textprops=None, center=(0, 0), frame=False, rotatelabels=False, *, data=None)
常用参数:
- x:数量,自动计算百分比
- labels:每部分名称
- autopct:占比显示指定%1.2f%%
- colors:每部分颜色
#1.准备数据
movie_names = ['雷神3:诸神黄昏','正义联盟','东方快车谋杀案','寻梦环游记','全球风暴','降魔传','追捕','战狼2']
place_count = [60605,54546,45819,28243,13270,9945,7679,68665]
#2.创建画布
plt.figure(figsize=(20,8), dpi=140)
#3.绘制饼图
plt.pie(place_count,labels=movie_names, colors=['b','r','g','c','m','y','k','b'], autopct='%1.2f%%')
#让图形保持圆形
plt.axis('equal')
#显示图例
plt.legend()
#保存图像
plt.savefig('03-6')
#4.显示图像
plt.show()
输出显示: