Jupyter介绍
Jupyter Notebook是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序。如在编程过程中需要编写说明文档,可在同一个页面中直接编写,便于作及时的说明和解释。
Jupyter Notebook的主要特点
① 编程时具有语法高亮、缩进、tab补全的功能。
② 可直接通过浏览器运行代码,同时在代码块下方展示运行结果。
③ 以富媒体格式展示计算结果。富媒体格式包括:HTML,LaTeX,PNG,SVG等。
④ 对代码编写说明文档或语句时,支持Markdown语法。
⑤ 支持使用LaTeX编写数学性说明。
安装Jupyter Notebook
安装Jupyter Notebook的前提是需要安装了Python(3.3版本及以上,或2.7版本)。
安装命令:pip install jupyter
版本:Python 3.x
安装命令:pip3 install jupyter
版本:Python 2.x
安装命令:pip install jupyter
换源安装
pip install jupyter-i https://pypi.tuna.tsinghua.edu.cn/simple
如果你有任何jupyter notebook命令的疑问,可以考虑查看官方帮助文档,命令如下:
jupyter notebook --help
Jupyter Notebooks的使用
如何运行 Jupyter Notebooks?
命令行模式(按 Esc 生效),Esc --> 命令模式
F: 查找并且替换
Ctrl-Shift-F: 打开命令配置
Ctrl-Shift-P: 打开命令配置
Enter: 进入编辑模式
P: 打开命令配置
Shift-Enter: 运行代码块, 选择下面的代码块
Ctrl-Enter: 运行选中的代码块
Alt-Enter: 运行代码块并且插入下面
Y: 把代码块变成代码
M: 把代码块变成标签
R: 清除代码块格式
1: 把代码块变成heading 1
2: 把代码块变成heading 2
3: 把代码块变成heading 3
4: 把代码块变成heading 4
5: 把代码块变成heading 5
6: 把代码块变成heading 6
K: 选择上面的代码块
上: 选择上面的代码块
下: 选择下面的代码块
J: 选择下面的代码块
Shift-K: 扩展上面选择的代码块
Shift-上: 扩展上面选择的代码块
Shift-下: 扩展下面选择的代码块
Shift-J: 扩展下面选择的代码块
Ctrl-A: select all cells
A: 在上面插入代码块
B: 在下面插入代码块
X: 剪切选择的代码块
C: 复制选择的代码块
Shift-V: 粘贴到上面
V: 粘贴到下面
Z: 撤销删除
D,D: 删除选中单元格
Shift-M: 合并选中单元格, 如果只有一个单元格被选中
Ctrl-S: 保存并检查
S: 保存并检查
L: 切换行号
O: 选择单元格的输出
Shift-O: 切换选定单元的输出滚动
H: 显示快捷键
I,I: 中断服务
0,0: 重启服务(带窗口)
Esc: 关闭页面
Q: 关闭页面
Shift-L: 在所有单元格中切换行号,并保持设置
Shift-空格: 向上滚动
空格: 向下滚动
**实际上,大家不需要去背这些快捷键。可以进入命令模式,摁住H就可以看到快捷键了。
**
Matplotlib介绍
Matplotlib是一个Python的基础绘图库,它可与 NumPy 一起使用,代替Matlab使用
图片与子图
Matplotlib所绘制的图位于图片(Figure)对象中。我们可以通过plt.figure生成一个新的图片:
下面展示一些 内联代码片
。
from matplotlib import pyplot as plt
fig = plt.figure()
代码展示:
import matplotlib.pyplot as plt
1-子图的绘制
plt.figure()
plt.subplot()
# plt.figure??
fig = plt.figure()
# plt.subplot??
# plt.subplot(221)
ax1 = plt.subplot(2,2,1) # 2*2 最多为4个图形 index=1 选择了第一个
ax2 = plt.subplot(2,2,2)
ax3 = plt.subplot(2,2,3)
ax4 = plt.subplot(2,2,4)
# ax5 = plt.subplot(2,2,5) # 超出报错
ax2.scatter(range(5),range(5)) # 给ax2子图对象绘制散点图
plt.show() # 展示图片
除此之外,Matplotlib包含一个便捷方法plt.subplots创建一个新的图片,然后返回包含了已生成子图对象的Numpy数组。
• plt.subplots(nrows, ncols, sharex, sharey)
• nrows子图的行数
• ncols子图的列数
• sharex 所有子图使用相同的x轴刻度
• sharey 所有子图使用相同的y轴刻度
代码展示:
2-子图的绘制
plt.subplots()
# plt.subplots??
fig,axs = plt.subplots(2,2,sharex=True,sharey=True,figsize=(14,8)) # 2*2 nrows子图的行数 ncols子图列数 sharex,sharey 共享x,y轴
axs[0,0].scatter(range(5),range(5)) # [0,0]选中第一张图
axs[0,1].scatter(range(5),list(range(5))[::-1]) # [0,1] 选中第二张图
# 调整间距
plt.subplots_adjust(wspace=0,hspace=0)
plt.show()
Matplotlib绘制图形
matplotlib能够绘制折线图,散点图,条形图,直方图,饼图等等。
具体可参考:https://matplotlib.org/gallery/index.html
折线图
代码展示:
from matplotlib import pyplot as plt
plt.plot?? #查看源码以及属性介绍
x = [1,2,3,4] # 列表 array_like
y = [4,2,3,1]
plt.plot(x,y) # 绘制折线图
plt.show() # 展示图片,释放内存
代码展示:
x = [1,2,3,4] # 列表 array_like
y = [4,2,3,1]
plt.plot(x,y,color="g",linestyle="--",marker="*") # 绘制折线图
plt.show() # 展示图片,释放内存
plt.plot()参数使用具体可参考:
https://matplotlib.org/api/_as_gen/matplotlib.axes.Axes.plot.html#matplotlib.axes.Axes.plot
练习1:假设一天中每隔两个小时的气温分别是[15,13,14.5,17,20,25,26,26,27,22,18,15],绘制图形。
代码展示:
# 每隔两个小时 2 4 6 8... 24
x = range(0,24,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 设置刻度 以x显示
plt.xticks(x)
# 绘制图形
plt.plot(x,y)
# 展示图形
plt.show()
如图所示:
设置刻度为 0,0.5,1,1.5…23.5
注意:range(0,24,0.5)报错 # start stop step 不要用浮点数
[i/2 for i in range(0,48)] # 列表推导式
代码展示:
# 放大画布
plt.figure(figsize=(14,8))
# 每隔两个小时 2 4 6 8... 24
x = range(0,24,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 设置刻度 以 0,0.5,1,1.5......23.5 显示
x_t = [i/2 for i in range(0,48)]
plt.xticks(x_t,rotation=45)
# 绘制图形
plt.plot(x,y)
# 展示图形
plt.show()
如图所示:
设置x刻度以 0h,0.5h,1h,1.5h…23.5h 显示
代码展示:
# 放大画布
plt.figure(figsize=(14,8))
# 每隔两个小时 2 4 6 8... 24
x = range(0,24,2)
y = [15,13,14.5,17,20,25,26,26,27,22,18,15]
# 设置x刻度 以 0h,0.5h,1h,1.5h......23.5h 显示
# ticks:刻度
# lables:标签
x_t = [i/2 for i in range(0,48)]
x_l = ["{}h".format(i/2) for i in range(0,48)]
plt.xticks(x_t,x_l,rotation=45) # x_t刻度,x_l刻度标签
# 设置y刻度 最大值最小值
y_t = range(min(y),max(y)+1)
plt.yticks(y_t)
# 绘制图形
plt.plot(x,y)
# 添加x轴标签
plt.xlabel("time")
# 添加y轴标签
plt.ylabel("temperature")
# 添加标题
plt.title("temperature change")
# 添加网格
plt.grid()
# 保存图片 注意:要在show之前保存 否则:空白图
# plt.savefig("mat.png")
plt.savefig("mat.jpg")
# 展示图形 释放
plt.show()
如图所示:
plt.figure(figsize=None,dpi=None)
生成新的图片,figsize:图片大小,dpi:透明度
plt.savefig(fname)
保存图片
plt.xticks(ticks=None)
设置x轴刻度的值
plt.yticks(ticks=None)
设置y轴刻度的值
plt.xlabel(xlabel)
设置x轴标签
plt.ylabel(ylabel)
设置y轴标签
plt.title()
设置图标题
plt.grid()
根据x轴和y轴的数值展示轴网格
练习2:如果列表a表示10点到12点的每一分钟的气温,如何绘制折线图观察每分钟气温的变化情况
代码展示:
import random # 内置模块 随机
全局的设置方式
设置matplotlib自带的字体 只能设置.ttf字体,不支持.ttc字体
import matplotlib
font = {
'family':'SimHei',
'weight':'bold',
'size':12
}
matplotlib.rc("font", **font)
matplotlib.rc??
设置字体法2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
设置字体法3:局部
- 相当于将字体注册到了matplotlib字体库中
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=14)
# x,y数据
x = range(0,120)
y = [random.randint(30,38) for i in range(120)] # 生成120个随机整数
# 绘制图形
plt.plot(x,y)
# x刻度:0,10,20,30,40,50....110
x_t = range(0,120,10)
# 显示x刻度标签 为 十点0分 十点10分 ..十点50分 十一点0分...十一点50分
x_l = ["十点{}分".format(i) for i in range(0,60,10)]
x_l+=["十一点{}分".format(i) for i in range(0,60,10)]
plt.xticks(x_t,x_l,rotation=45,fontproperties=font)
plt.show()
如图所示:
假设大家在30岁的时候,根据自己的实际情况,统计出来了你和同桌从11岁到30岁每年交的男女朋友的数量如列表a和b,请绘制出该数据的折线图,以便分析自己和同桌每年交男女朋友的数量走势
代码展示:
from matplotlib import pyplot as plt
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", size=10)
# 构建x,y
my_y = [1,0,1,1,2,4,3,2,3,4,4,5,6,5,4,3,3,1,1,1]
my_cls_y = [1,0,3,1,2,2,2,3,1,1,1,1,1,2,1,1,2,3,2,2]
x = range(11,31)
# len(my_y) == len(x)
# 绘图
plt.plot(x,my_y,label="自己")
plt.plot(x,my_cls_y,label="同桌")
# 添加图例
# 1.plt.plot()添加label属性
# 2.plt.legend() 局部指定字体 而是使用 prop
plt.legend(prop = font)
# 刻度 11岁..30岁
x_l = ["{}岁".format(i) for i in x]
plt.xticks(x,x_l,fontproperties=font,rotation=45)
# 添加数据标签
# for x_i,y_i in zip(x,my_y):
# plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i-1))
# for x_i,y_i in zip(x,my_cls_y):
# plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i-1))
def auto_label(x_po,y_po):
for x_i,y_i in zip(x_po,y_po):
plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i-0.1))
auto_label(x,my_y)
auto_label(x,my_cls_y)
# 展示图片
plt.show()
代码展示:
# plt.annotate??
from matplotlib import pyplot as plt
import random
li = [random.randint(10,30) for i in range(10)]
li
# 结果为:[28, 26, 26, 22, 14, 22, 14, 13, 17, 19]
y = li # [28, 26, 26, 22, 14, 22, 14, 13, 17, 19]
x = range(10) # [0,1,2,.....9]
plt.plot(x,y,marker="*")
# plt.annotate("28",xy=(0,28),xytext=(-0.3,28))
# plt.annotate("28",xy=(0,28),xytext=(-0.3,0),arrowprops={"width":2})
# 实现:将每个点都使用上数据标签
# 思路:什么在变?对应的参数(坐标)在变
# (0,28) (1,26)
# plt.annotate("28",xy=(0,28),xytext=(-0.3,28))
for x_i,y_i in zip(x,y):
plt.annotate(f"{y_i}",xy=(x_i,y_i),xytext=(x_i,y_i-1))
plt.show()
散点图绘制
散点图通过scatter()函数绘制
• plt.scatter(x,y) # 以默认的形状颜色等绘制散点图
假设通过爬虫你获取到了长沙2019年4,10月份每天白天的最高气温(分别位于列表a,b),那么此时如何寻找出气温和随时间变化的某种规律
代码展示:
# plt.scatter??
# x,y
y_4 = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]
x = range(1,32) # 4,10共享x 31天
# 绘制图形
plt.scatter(x,y_4)
plt.scatter(x,y_10)
plt.show()
# 优化:4,10月份的分布分开
# x,y
y_4 = [11,17,16,11,12,11,12,13,10,14,8,13,12,15,14,17,18,21,16,17,30,14,15,15,15,19,21,22,22,22,23]
y_10 = [26,26,28,19,21,17,16,19,18,20,20,19,22,23,17,20,21,20,22,15,11,15,5,13,15,10,11,13,12,13,6]
x_4 = range(1,32) # 1~31
x_10 = range(51,82) # 20+31 ~ 31+31+20
# 绘制图形
plt.scatter(x_4,y_4)
plt.scatter(x_10,y_10)
# 刻度 四月1号 四月31号 十月1号..十月31号
x_t = list(x_4)+list(x_10)
x_l = ["四月{}号".format(i) for i in x_4]
x_l += ["十月{}号".format(i-50) for i in x_10] # 51-50,81-50
plt.xticks(x_t[::4],x_l[::4],fontproperties=font,rotation=45)
plt.show()
如图所示:
条形图
条形图介绍
条形图是用宽度相同的条形的高度或长短来表示数据多少的图形。条形图可以横置或纵置,纵置时也称为柱形图。
特点
• 能够使人们一眼看出各个数据的大小。
• 易于比较数据之间的差别。
条形图绘制方法:
条形图通过bar()函数绘制
plt.bar(x, height) # 绘制以x为x轴位置,height为y轴位置的竖条形图
练习
假设你获取到了2019年内地电影票房前20的电影(列表a)和电影票房数据(列表b),那么如何更加直观的展示该数据
代码展示:
# 构建x,height
a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]
# 放大画布
plt.figure(figsize=(14,8))
# 柱状图
# width 调整柱子的宽度 默认0.8
# bottom y的起始值改变了 堆叠图
# align 默认为:center居中 设置为:edge边缘 取决于width的正负 正:右边 负:左边
plt.bar(a,b,width=-0.3,bottom=10,align="edge")
# 设置刻度
plt.xticks(fontproperties=font,rotation=90)
plt.show()
代码展示:
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 步骤一(替换sans-serif字体)
plt.rcParams['axes.unicode_minus'] = False # 步骤二(解决坐标轴负数的负号显示问题)
# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sales = [1000,800,3000]
Q2_sales = [1200,700,2800]
# 柱子的对应索引位置 [0,1,2]
# 设置柱子宽度
width = 0.35
# rects1 = plt.bar(list(range(len(fruits))),Q1_sales,width)
# rects2 = plt.bar(list(range(len(fruits))),Q2_sales,width)
# 蓝黄柱子宽度都为0.35 怎么使蓝色显示左边 黄色显示右边
# 位置左移width/2 位置-width/2 [0-width/2,1-width/2,2-width/2]
po_l = [i-width/2 for i in list(range(len(fruits)))]
plt.bar(po_l,Q1_sales,width,label="Q1")
po_r = [i+width/2 for i in list(range(len(fruits)))]
plt.bar(po_r,Q2_sales,width,label="Q2")
# 设置图例
plt.legend()
# 数据标签
auto_label(po_l,Q1_sales)
auto_label(po_r,Q2_sales)
plt.xticks(list(range(len(fruits))),fruits)
plt.show()
代码展示:
# 构建x,height
fruits = ["苹果","梨子","车厘子"]
Q1_sales = [1000,800,3000]
Q2_sales = [1800,200,2800]
plt.bar(fruits,Q1_sales,width=0.5,label="Q1")
plt.bar(fruits,Q2_sales,width=0.5,bottom=Q1_sales,label="Q2")
plt.legend()
plt.show()
# plt.barh??
a = ["流浪地球","复仇者联盟4:终局之战","哪吒之魔童降世","疯狂的外星人","飞驰人生","蜘蛛侠:英雄远征","扫毒2天地对决","烈火英雄","大黄蜂","惊奇队长","比悲伤更悲伤的故事","哥斯拉2:怪兽之王","阿丽塔:战斗天使","银河补习班","狮子王","反贪风暴4","熊出没","大侦探皮卡丘","新喜剧之王","使徒行者2:谍影行动","千与千寻"]
b = [56.01,26.94,17.53,16.49,15.45,12.96,11.8,11.61,11.28,11.12,10.49,10.3,8.75,7.55,7.32,6.99,6.88,6.86,6.58,6.23,5.22]
plt.figure(figsize=(14,8))
plt.barh(a,b,height=0.5)
plt.show()