人工智能
- python,大数据,机器学习,深度学习,计算机视觉
-
五、机器学习数据科学包(numpy、pandas、matpotlib)篇(四)matplotlib图表 - 前言
- Xmind图谱
- 散点图:plt.scatter()
- 折线图:plt.plot()
- 条形图:plt.bar() 和 plt.barh()
- 直方图:plt.hist() 和 ==plt.hist2d() ----- 用于探索 双变量的联合分布==
- 饼状图:plt.pie()
- 箱形图:plt.boxplot()
- 颜色和样式
- 子图:plt.subplot()
- 多图:plt.figure()
- 网格:plt.grid()
- 图例legend:plt.legend()
- 坐标轴范围:plt.axis()
- 坐标轴刻度:plt.gca() 和 plt.gca().(...)
- 添加坐标轴:plt.twinx() 和 plt.twiny() ----- 双胞胎x轴y轴
- 小结:numpy和pandas必会作业练习
python,大数据,机器学习,深度学习,计算机视觉
五、机器学习数据科学包(numpy、pandas、matpotlib)篇(四)matplotlib图表
前言
回顾一下从.csv文件读取数据,假设有一存放股票信息的000001.csv文件,打开后其部分内容如下,
要从文件读取股票Date,Low,Turnover信息,代码如下:
import numpy as np
#(1)读取到一个变量里以array存放存放Date,Low,Turnover
# 导入csv文件,分隔识别符delimiter是逗号,读取时skiprows跳过第一行,读取时usecols使用第1,4,6列。
x = np.loadtxt('000001.csv', delimiter=',', skiprows=1, usecols=(1,4,6), unpack=False)# unpack默认是False,可省略
#(2)读取到三个变量里分别存放Date,Low,Turnover
# unpack:不把读取的数据放在一个变量里边。
open, close, volume = np.loadtxt('000001.csv', delimiter=',', skiprows=1, usecols=(1,4,6), unpack=True)# 将读取的三列数据分别放在三个变量里面
# test
print(x) #或print(x.shape)查看结果
print(open)
print(close)
print(volume)
Xmind图谱
散点图:plt.scatter()
例1. 简单的例子:身高–体重
matplotlib.pyplot带的 散点函数scatter()
import numpy as np
import matplotlib.pyplot as plt
height = [161, 170, 182, 175, 173, 165]
weight = [50, 58, 80, 70, 69, 55]
# scatter v./n.散射
plt.scatter(height, weight) # 不同于plot。plot(x_list,y_list)是连点成线,scatter(x_list, y_list)就是散点。
plt.show()
运行结果:
例2. 正相关、负相关、不相关相关性
import numpy as np
import matplotlib.pyplot as plt
N = 1000
# 无相关
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y)
plt.show()
# 正相关
x = np.random.randn(N)
y = x + np.random.randn(N)*0.5 # y是由x生成的,必定相关。
plt.scatter(x, y)
plt.show()
# 负相关
x = np.random.randn(N)
y = -x + np.random.randn(N)*0.5
plt.scatter(x, y)
plt.show()
运行结果:
例3. 实例:股票价格涨幅
股票当日涨幅和前一天的涨幅是否具有相关性(前一天涨,第二天是否也涨?)
import numpy as np
import matplotlib.pyplot as plt
# 文件读取 股市开盘价,收盘价
open, close = np.loadtxt('000001.csv', delimiter=',', skiprows=1, usecols=(1, 4), unpack=True)
change = close - open
yesterday = change[:-1]
today = change[1:]
plt.scatter(yesterday, today)
plt.show()
运行结果:
可以看到股票当日涨幅和前一天的涨幅不具有相关性,即不存在前一天涨,第二天也涨的规律。
例4. scater() 的参数 c, s, alpha, marker
import numpy as np
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
N = 1000
# 无相关
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y, s=100, c='r', marker='<')
plt.show()
运行结果:
import numpy as np
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.pyplot as plt
N = 1000
# 无相关
x = np.random.randn(N)
y = np.random.randn(N)
plt.scatter(x, y, s=100, c='r', alpha=0.5)# 透明度改为0.5
plt.show()
运行结果:
可以看到颜色深的地方是点密集的地方,如果透明度用默认的alpha=1,则看不出颜色深浅。
所以改变透明度alpha的值可以通过颜色深浅看出点的密集程度
上面图可以放大了看,如下效果:
折线图:plt.plot()
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-10, 10, 5) # -10~10分成5份
y = x**2
plt.plot(x, y)
plt.show()
运行结果:
条形图:plt.bar() 和 plt.barh()
例1
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(5) # [0,1,2,3,4]
y = [20, 10, 30, 25, 15]
# 下面plt.figure()将运行结果三张图一起显示出来。
# 第一个figure图:
plt.figure()
pl = plt.bar(x, y) # pl = plt.bar(x=x, height=y)
# 第二个figure图:
plt.figure()
# 设置参数:条形宽度、条形颜色。默认width=0.8, color='blue'(或color='b')
pl = plt.bar(x, y, 0.5, color='red') # pl = plt.bar(x=x, height=y, width=0.5, color='red')
# 第三个figure图:
plt.figure()
# 水平条形图
pl = plt.barh(x, y, 0.5, color='red') # pl = plt.barh(y=x, width=y, height=0.5, color='red')
#也可这么写,仅做参考 pl = plt.bar(x=0, bottom=x, width=y, height=0.5, color='red', orientation='horizontal') # 或 pl = plt.bar(x, y)
# 为此,定义变量时:可将x变量换成index
plt.show()
运行结果:
例2. 并列的条形图
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(4)
sales_BJ = [52,55,63,53] # 北京销售量
sales_SH = [44,66,55,31] # 上海销售量
bar_width = 0.3
plt.bar(x, sales_BJ, bar_width, color='b') # 北京
# 即 plt.bar(x=x, height=sales_BJ, width=bar_width, color='b')
# 横向堆叠
plt.bar(x+bar_width, sales_SH, bar_width, color='r')# 上海
# 即 plt.bar(x=x+bar_width, height=sales_SH, width=bar_width, color='r')
plt.show()
运行结果:
例3. 层叠的条形图
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(4)
sales_BJ = [52,55,63,53] # 北京销售量
sales_SH = [44,66,55,31] # 上海销售量
bar_width = 0.3
plt.bar(x, sales_BJ, bar_width, color='b') # 北京
# 即 plt.bar(x=x, height=sales_BJ, width=bar_width, color='b')
# 竖向堆叠
plt.bar(x, sales_SH, bar_width, color='r', bottom=sales_BJ)# 上海
# 即 plt.bar(x=x, height=sales_SH, width=bar_width, color='r', bottom=sales_BJ)
plt.show()
运行结果:
直方图:plt.hist() 和 plt.hist2d() ----- 用于探索 双变量的联合分布
例1.单变量直方图(1-D直方图)
import numpy as np
import matplotlib.pyplot as plt
mu = 100 # mean of distribution
sigma =20 # standard deviation of distribution
x = mu + sigma*np.random.randn(2000)
plt.figure()
plt.hist(x, bins=10, color='green')
plt.figure()
plt.hist(x, bins=10, color='red', normed=True)# normed默认False则显示实际数,True则显示比例频率。
plt.show()
运行结果:
注:当条形越多越接近一条平滑的曲线。
例2. 双变量联合直方图(2-D直方图)----- 探索双变量的联合分布时非常有用!
不再是例1(1-D直方图)中用y值高度表示频率大小,2-D直方图是用颜色深浅表示频率大小。
import numpy as np
import matplotlib.pyplot as plt
x = np.random.randn(1000)+2
y = np.random.randn(1000)+3
plt.hist2d(x, y, bins=40)
plt.show()
运行结果:
从图中:越往中间越亮,说明频率越高。越往边缘越暗,说明频率越低。
饼状图:plt.pie()
# import numpy as np
import matplotlib.pyplot as plt
fracs = [15, 30, 45, 10] # (15:30:45:10)*100%,第一份占比15/(15+30+45+10)*100% = 15%
# fracs = [15, 10, 15, 10] # (15:10:15:10)*100%,第一份占比15/(15+10+15+10)*100% = 30%
labels = 'A', 'B', 'C', 'D'
# 设置属性
explode = [0, 0.08, 0, 0]
plt.axes(aspect=1) # 显示为圆形饼状图,不写这句话则默认椭圆形。
# pie()参数:x各份占比,labels各份标签名,autopct = auto percent显示各份占比, explode分离各份与圆心的距离以便突出显示,shadow阴影立体感
plt.pie(x=fracs, labels=labels, autopct='%.0f%%', explode=explode, shadow=True)
############### 注释 start ###################
""""autopct='%.0f%%'为python语法,举例如下:"""
# a = 23
# print("%.2f" %a) # 结果:23.00
# print("%.2f%%" %a) # 结果:23.00% %是占位符如同\的转义字符
# print("%.2f%%" %23) # 结果:23.00%
############### 注释 end ###################
plt.show()
运行结果:
箱形图:plt.boxplot()
例1
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100) # seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。 参考:https://blog.csdn.net/linzch3/article/details/58220569
data = np.random.normal(size=1000, loc=0, scale=1) # 随机生成1000个元素的一维数组
plt.boxplot(data, sym='o', whis=1.5)
plt.show()
运行结果:
例2
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=(1000, 4), loc=0, scale=1) # 1000行*4列的二维数组
labels = ['A', 'B', 'C', 'D']
plt.boxplot(data, labels=labels)
plt.show()
运行结果:
颜色和样式
(1)颜色
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
# 设置颜色,默认蓝色
# 法1:单词法
plt.plot(y, color='g') # 或green
# 法2:灰度法
plt.plot(y+1, color='0.5') # 灰度为0.5
# 法3:十六进制法
plt.plot(y+2, color='#FF00FF') # 紫红色
# 法4:RGB元组法
plt.plot(y+3, color=(0.1, 0.2, 0.3)) # 蓝黑色
plt.show()
运行结果:
注:既使不设置颜色,生成不同的直线时也会自动分配颜色,按照系统默认顺序,顺序如下:
(2)点型
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
# 设置点
plt.plot(y, marker = 'o') # marker可以省略,会自动匹配。但写maker是线,省略marker是点
plt.plot(y+1, marker = 'D')
plt.plot(y+2, '^')
plt.plot(y+3, 'p')
plt.show()
运行结果:
注:具体的点、线形状表示见前面Xmind图
(3)线型
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
# 设置线型
plt.plot(y, '-') # 默认实线
plt.plot(y+1, '--') # 虚线
plt.plot(y+2, '-.') # 点划线
plt.plot(y+3, '.') # 点线
plt.show()
运行结果:
(4)样式字符串
可以将上面的组合起来使用,即将颜色、点型、线型写成一个字符串。
import numpy as np
import matplotlib.pyplot as plt
y = np.arange(1, 5)
# 样式字符串法:组合一起使用
plt.plot(y, 'ro--') # 红色 圆点 虚线
plt.plot(y+1, 'g*:') # 绿色 星型点 点线
plt.plot(y+2, 'kp-') # 黑色 五边形点 实线
plt.show()
子图:plt.subplot()
子图即将一张图分成多个,生成多个子图,用的Matplotlib对象知识。
参数:FigureCanvas画布,Figure图,Axes坐标轴。
法1:直接法
直接用 子图函数subplot, sub表子
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 100)
# plt自带的子图函数subplot, sub表子
plt.subplot(221)
plt.plot(x, x)
plt.subplot(222)
plt.plot(x, -x)
plt.subplot(223)
plt.plot(x, x*x)
plt.subplot(224)
plt.plot(x, np.log(x))
plt.show()
运行结果:
法2:对象法,生成figure对象
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 100)
fig = plt.figure() # 生成figure对象。一张图
# 子图1
# figure图的对象fig调用add_subplot添加子图
ax1 = fig.add_subplot(221) # 分成2行*2列 = 4份,用第1份。
ax1.plot(x, x)
# 子图2
ax2 = fig.add_subplot(222) # 分成2行*2列 = 4份,用第2份
ax2.plot(x, -x)
# 子图3
ax2 = fig.add_subplot(223) # 分成2行*2列 = 4份,用第3份
ax2.plot(x, x*x)
# 子图4
ax2 = fig.add_subplot(224) # 分成2行*2列 = 4份,用第4份
ax2.plot(x, np.log(x)) # numpy带的对数函数log()
plt.show()
运行结果:
附:子图的生成有三种方法:
(1)plt.subplots:如 fig, ax = plt.subplots(2, 2) #或 plt.subplots(22)
(2)plt.subplot:如 plt.subplot(2, 2, 1) # 或 plt.subplot(221)
(3)plt.add_subplot:如 fig = plt.figure() 再 ax = fig.add_subplot(2, 2, 1) # 或 fig.add_subplot(221)
可以参考 文章
多图:plt.figure()
前面用到过,就是运行的时候出来多个图。用一次plt.figure()就多出来一张
写法1(直接法):
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 100)
y = np.arange(1, 100)
plt.figure() # 为方便后面可能调用,常常写 fig1 = plt.figure()
plt.plot(x, y)
plt.figure() # 同理,为方便后面可能调用,常常写 fig2 = plt.figure()
plt.plot(x, y*y) # y*y即y**2。注意:y = np.arange(1, 100)可以 y*y, 若y = [1,2,3]这种写法不能y*y
plt.show()
运行结果:
写法2(对象法):
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 100)
y = np.arange(1, 100)
fig1 = plt.figure()
ax1 = fig1.add_subplot(111) # 分成1行*1列=1份,取第1份,即不分,子图就是整个原图。
ax1.plot(x, y)
fig2 = plt.figure()
ax2 = fig2.add_subplot(111)
ax2.plot(x, y*y)
plt.show()
运行结果同上。
网格:plt.grid()
网格的好处:可以很清楚的看到点对应的坐标值,进而能直观地反应出如斜率等信息。
法1(直接法):
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 5)
plt.plot(x, x*2)
# 开启网格
plt.grid() # 默认True,即plt.grid(True)
# plt.grid() # 若写了两句 plt.grid()或plt.grid(True)则关闭。
# plt.grid(False) 但写了两句 plt.grid(False)不会开启。
# 开启网格的同时,设置网格线颜色
plt.grid(color='r') # 设置红色,默认灰色!注意不是蓝色了!
# 开启网格的同时,设置网格线宽
plt.grid(linewidth='2') # 这里'2'也可写成2
# 开启网格的同时,设置网格线型
plt.grid(linestyle='--') # 设置虚线。默认实线'-'
# 可以同时设置
# plt.grid(color='r', linewidth=2, linestyle='--')
plt.show()
运行结果:
法2(对象法):
同样,也可以用面向对象方式生成网格
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 5)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, x*2)
ax.grid(color='r')
ax.grid(linewidth='2')
ax.grid(linestyle='--')
# 可以同时设置
# ax.grid(color='r', linewidth=2, linestyle='--')
plt.show()
运行结果同上。
【注意】:有一个小常识。面向对象方式生成的网格不会产生交互式效果。即当我们用命令行模式/命令行窗口写代码时,比如改变网格的颜色等,在命令行模式下回车运行代码,颜色不会改变,即看不到交互效果。
图例legend:plt.legend()
legend n.传说;图例,说明,解释。
写法一:在plt.plot()里先声明label,然后用legend图例化(相当于变量先声明再赋值)
例1. 小图例框legend位置loc
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 11, 1)
plt.plot(x, 2*x, label='Normal')
plt.plot(x, 3*x, label='Fast')
plt.plot(x, 4*x, label='Faster')
# 上面的label是不显示的,需要下面的legend()
plt.legend() # 显示上面的label,显示为一个小图例框legend
# 下面设置小图例框legend的位置,新版默认loc=0自适应最佳位置,很方便了。
# 小图例框位置 loc = location,一般我们使用默认的loc=0即可!
plt.legend(loc=0) # 0即best表自适应最佳位置。默认loc=0。等价plt.legend()
# plt.legend(loc=1) # 右上角
# plt.legend(loc=2) # 左上角
# plt.legend(loc=3) # 左下角
# plt.legend(loc=4) # 右下角
# plt.legend(loc=5) # 右侧
# plt.legend(loc=6) # 左侧居中
# plt.legend(loc=7) # 右侧居中
# plt.legend(loc=8) # 下侧居中
# plt.legend(loc=9) # 上侧居中
# plt.legend(loc=10) # 中心
plt.show()
运行结果:
例2 小图例框legend分列显示ncol
(1)分成3列:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 11, 1)
plt.plot(x, 2*x, label='Normal')
plt.plot(x, 3*x, label='Fast')
plt.plot(x, 4*x, label='Faster')
plt.legend(ncol=3) # 小图例框legend 分成3列col显示
# plt.legend(ncol=2) # 分成2列col显示
plt.show()
运行结果:
(2)分成2列:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 11, 1)
plt.plot(x, 2*x, label='Normal')
plt.plot(x, 3*x, label='Fast')
plt.plot(x, 4*x, label='Faster')
plt.legend(ncol=2) # 小图例框legend 分成2列col显示
plt.show()
运行结果:
注意:只有分列没有分行,只有ncol没有nrow。
写法二:直接legend()定义标签和图例化一起搞。(相对于变量声明并赋值)
举一个例子即可:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 11, 1)
plt.plot(x, 2*x)
plt.plot(x, 3*x)
plt.plot(x, 4*x)
plt.legend(['Normal', 'Fase', 'Faster'])
# 可以一起设置
# plt.legend(['Normal', 'Fase', 'Faster'], col=10, ncol=3)
plt.show()
运行结果:
注:
同样:上面的都算是 (plt直接法),还可以 (对象法)。
举一个例子即可:
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 11, 1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, 2*x)
ax.plot(x, 3*x)
ax.plot(x, 4*x)
ax.legend(['Normal', 'Fase', 'Faster'])
# 可以一起设置
# ax.legend(['Normal', 'Fase', 'Faster'], col=10, ncol=3)
plt.show()
运行结果同上。
坐标轴范围:plt.axis()
1、原图(作为对比):
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11, 1)
# 二次函数
plt.plot(x, x*x)
# 加网格,看得清晰
plt.grid(color='r', linestyle='--')
plt.show()
运行结果:
2、plt.axis(): 截取原图的一部分显示。------ 除了直接法,还可以用对象法
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11, 1)
# 二次函数
plt.plot(x, x*x)
# axis() 可限定坐标轴范围
plt.axis([-5, 5, 20, 60]) # 截取图,取坐标范围,x:-5~5; y:20~60 ,只显示此范围内的图。
# 加网格,看得清晰
plt.grid(color='r', linestyle='--')
plt.show()
运行结果:
3、
- plt.xlim(): 只限定x轴范围; (xlim = x + limit)
- plt.ylim(): 只限定y轴范围
- 上面两个都只能用plt直接法,不能用figure对象法。
(1)限定x
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11, 1)
# 二次函数
plt.plot(x, x*x)
# xlim() 只限定x轴范围
plt.xlim([-5, 5])
# 加网格,看得清晰
plt.grid(color='r', linestyle='--')
plt.show()
运行结果:
(2)限定y
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11, 1)
# 二次函数
plt.plot(x, x*x)
# ylim() 只限定y轴范围
plt.ylim([0, 60])
# 加网格,看得清晰
plt.grid(color='r', linestyle='--')
plt.show()
运行结果:
(3)限定x上下限
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11, 1)
# 二次函数
plt.plot(x, x*x)
# 限定x轴范围:-5~10
plt.xlim(xmin=-5, xmax=10)
# 加网格,看得清晰
plt.grid(color='r', linestyle='--')
plt.show()
运行结果:
(4)限定x下限
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(-10, 11, 1)
# 二次函数
plt.plot(x, x*x)
# 限定x下限是-5
plt.xlim(xmin=-5)
# 加网格,看得清晰
plt.grid(color='r', linestyle='--')
plt.show()
运行结果:
坐标轴刻度:plt.gca() 和 plt.gca().(…)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 11, 1)
plt.plot(x, x)
ax = plt.gca() # 获取当前坐标轴
# 调整坐标轴x,y轴为5个刻度
ax.locator_params(nbins=5)
# ax.locator_params('x', nbins=5) # 只调整x轴为5个刻度
plt.show()
运行结果:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import datetime
fig = plt.figure()
start = datetime.datetime(2018, 1, 1)
stop = datetime.datetime(2019, 1, 1)
delta = datetime.timedelta(days=1)
dates = mpl.dates.drange(start, stop, delta)
y = np.random.rand(len(dates))
ax = plt.gca() # 获取当前坐标轴
ax.plot_date(dates, y, linestyle='-', marker='') # plot_date进行时间图形的绘制
date_format = mpl.dates.DateFormatter('%Y-%m') # %Y-%m-%d 时间格式化
ax.xaxis.set_major_formatter(date_format) # 将上面的date_format应用到图上面
fig.autofmt_xdate() # x轴时间下标数字,美化显示,自适应
plt.show()
运行结果:
添加坐标轴:plt.twinx() 和 plt.twiny() ----- 双胞胎x轴y轴
比如:一幅图有两个函数曲线,我们添加一个y轴给第二个函数使用。
法1:plt直接法
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(2, 20, 1)
y1 = x*x
y2 = np.log(x)
plt.plot(x, y1) # 默认蓝色 即 plt.plot(x, y1, 'b')蓝色
# 添加坐标轴,共用一个x轴,在右侧又多出来一个y轴,给(x, y2)用。----- 双坐标轴
plt.twinx()
plt.plot(x, y2, 'r') # 红色
plt.show()
运行结果:
法2:figure对象法
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(2, 20, 1)
y1 = x*x
y2 = np.log(x)
fig = plt.figure()
ax1 = fig.add_subplot(111)
ax1.plot(x, y1) # 默认蓝色 即 plt.plot(x, y1, 'b')蓝色
ax1.set_xlabel('Compare Y1 and Y2') # x轴命名为 ompare Y1 and Y2
ax1.set_ylabel('Y1') # y轴命名为Y1
# 双坐标轴,在右侧又多出来一个y轴,给(x, y2)用
ax2 = ax1.twinx()
ax2.plot(x, y2, 'r') # 红色
ax2.set_ylabel('Y2') # y轴命名为Y2
plt.show()
运行结果:
小结:numpy和pandas必会作业练习
1.会用matplotlib.pyplot包的plot()描点划线。
import matplotlib.pyplot as plt
plt.plot([1,2,4,5],[1,4,6,-1]) #plot(): 坐标x=[1,2,4,5], y=[1,4,6,-1]
plt.show()
2.
- 使用numpy生成100以内随机数组,
- 再对数组求最大值、最小值、均值、方差,并进行排序。
- 将数组存储到文件,再从该文件中读取数组,
代码如下:
import numpy as np
a = np.random.randint(1, 100, 10)
print(a)
#(np函数法)
print(np.min(a), np.max(a), np.mean(a), np.var(a)) # mean均值,var方差
#(对象调用法)
print(a.min(), a.max(), a.mean(), a.var())
#(np排序法)np.sort(a)原a不变,相当于np.sort()生成了一个copy()后去排序。
print(np.sort(a))
print(a)
#(对象排序法)a.sort()原a改变。是对象a自己调用sort(),那你自己调用sort 自己肯定会改变啊
y = a.sort()
print(y) # 结果None
print(a)
np.savetxt('01_numpy_task_2.csv', a) # 保存的文件格式自定义txt,csv等。不指定默认文本也可以
a2 = np.loadtxt('01_numpy_task_2.csv')
print('读文件:', a2)
运行结果:
C:\Python\Anaconda3\python.exe C:/AI/AnacondaProject/1_numpy.py
[ 1 60 72 96 95 29 51 3 68 87]
1 96 56.2 1108.56
1 96 56.2 1108.56
[ 1 3 29 51 60 68 72 87 95 96]
[ 1 60 72 96 95 29 51 3 68 87]
None
[ 1 3 29 51 60 68 72 87 95 96]
读文件: [ 1. 3. 29. 51. 60. 68. 72. 87. 95. 96.]
Process finished with exit code 0
在 C:/AI/AnacondaProject/ 目录下还会看到刚刚生成的 01_numpy_task_2.csv文件。
【注】求均值有3种写法:
np.mean(a), np.average(a),
a.mean(), 但没有a.average()(错)
3.使用一个股票信息文件的数据,计算最高价和开盘价之差diff,绘出前后两天diff的散点图,研究是否有相关性。
如下载 http://down.licai668.cn/sample/sample_stk_tick.rar
4.画出x值为[0, 10]的正弦函数图像。
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0, 10, 100)
y = np.sin(x)
plt.plot(x, y)
plt.show()
运行结果:
5.生成两组大小为5的数据(数据自选),画出这两组数据水平的条形图,要求采用并列和层叠两种方式。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(5)
python_attention = [10,50,80,90,95]
php_attention = [30,50,70,80,70]
plt.figure()
plt.barh(x, python_attention, 0.3, color='b')
plt.barh(x+0.3, php_attention, 0.3, color='r')
plt.figure()
plt.barh(x, python_attention, 0.3, color='b')
plt.barh(x, php_attention, 0.3, color='r', left=python_attention)
plt.show()
运行结果:
6.
- 随机生成2000个数据,均值为10,方差为3
- 绘制两个直方图,bins分别为10和50,normed分别为True和False
- 随机生成x和y,分别2000个,x均值为1,y均值为5
- 绘制2-D直方图,bins为40个
7.画饼状图。其中labels = ‘BJ’, ‘SH’, ‘GD’, ‘SZ’ 和 fracs = [20, 10, 30, 25],要求:突出显示SZ, 百分比精确到小数点后1位,有阴影。
import matplotlib.pyplot as plt
fracs = [20, 10, 30, 25]
labels = 'BJ', 'SH', 'GD', 'SZ'
explode=[0, 0, 0, 0.05]
plt.pie(x=fracs, labels=labels, explode=explode, autopct='%.1f%%', shadow=True)
plt.show()
运行结果:
8.随机生成100*5的数组,绘制箱形图,使用sym,whis参数。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(100)
data = np.random.normal(size=(100, 5), loc=0, scale=1) # 1000行*5列的数组
labels = ['A', 'B', 'C', 'D','E']
plt.boxplot(data, labels=labels, sym='o', whis=1.5)
plt.show()
运行结果:
9.使用样式字符串绘制两条线:
- (1)红色,实线,圆点
- (2)黄色,虚线,三角形点
运行结果:
10. 创建一个 1*2 的子图区域,并画出不同图形。
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(1, 100)
# 直接法
# 子图函数subplot, sub表子
plt.subplot(121)
plt.plot(x, x*x)
plt.subplot(122)
plt.plot(x, np.log(x))
plt.show()
运行结果:
11.分别使用plt和面向对象两种方式绘制网络,绿色线,点划线,宽度为1.
法1(plt直接法)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 2*np.pi, 0.1)
plt.plot(x, np.sin(x))
plt.grid(color='g',linestyle='-.', linewidth=1)
plt.show()
运行结果:
法2(对象法)
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0, 2*np.pi, 0.1)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, np.sin(x))
ax.grid(color='g',linestyle='-.', linewidth=1)
plt.show()
运行结果同上。
【小技巧】:
以上哪个函数参数想不起来时,可以pycharm编辑器中输入该函数名,然后选中该函数按ctrl再单击,即出来函数的说明