pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,期中read_csv和read_table这两个使用最多
- 使用read_csv读取
- 使用read_table读取
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
df1 = pd.read_csv('./data/type_line') # read_csv默认是按照,去分割的 遇到-不分割 当成了一块内容
df1 = pd.read_csv('./data/type_line',sep='-') # 如果不是逗号分割的 需要指定分隔符
# 默认会把第一行当成列名 如果第一行不是列名 是内容 可以设置header参数为None
df1 = pd.read_csv('./data/type_line',sep='-',header=None)
df1.shape
df1
# 用来读取 table separated value tsv文件 是用\t分割的一系列值
pd.read_table('./data/wheats.tsv')
pd.read_table('./data/wheats.tsv',header=None)
# read_table也可以读其他类型的文件 只不过要指定分隔符
pd.read_table('./data/type_comma')
pd.read_table('./data/type_comma',sep=',')
pd.read_csv('./data/wheats.tsv',sep='\t',header=None)
读写excel
使用 pd.read_excel() 读取excel表格
使用 df.to_excel() 输出excel表格
可能需要安装库 >>> conda install openpyxl >>> conda install xlsxwriter >>> conda install xlrd
df2 = pd.read_excel('./data/jfeng.xlsx')
df2
# 要保存哪个DataFrame 就用这个DataFrame调用 to_excel方法 (注意是DataFrame对象 不是pandas模块)
df2.to_excel('./jfeng.xlsx')
读取sqlite文件(其他数据库文件也是类似的操作 这里以sqlite为例)
导包 import sqlite3
import sqlite3
连接数据库
sqlite3.connect('dbpath')
读取table内容
pd.read_sql("SQL语句", con)
写入数据库文件 df对象.to_sql('table_name',connection)
操作数据库 connection.execute(SQL语句)
connection = sqlite3.connect('./data/weather_2012.sqlite')
connection
# 数据库可视化工具 mysql-Navicat MongoDB-robot 3T sqllite-SQLite Expert Personal
# sql, con, index_col=None
# 查询: 传入查询语句 连接对象 设置索引列
pd.read_sql('select * from weather_2012',connection)
pd.read_sql('select * from weather_2012',connection,index_col='index')
# 创建表格 把df2这个表格存入数据库
# 参数 name, con 要新建的表格的名字 连接对象
df2.to_sql('jfeng',connection)
# 删除表格
connection.execute('drop table jfeng') # drop table 要删除的表格名
使用read_csv直接读取网络上的数据
url = 'https://raw.githubusercontent.com/datasets/investor-flow-of-funds-us/master/data/weekly.csv'
url = 'https://raw.githubusercontent.com/datasets/investor-flow-of-funds-us/master/data/weekly.csv'
pd.read_csv(url)
透视表
各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上的分组键将数据分配到各个矩形区域中
data = np.random.randint(60,100,size=(6,2))
columns = ['height','weight']
df = DataFrame(data=data,columns=columns)
df['age'] = [20,18,30,26,22,32]
df['smoke'] = [True,False,True,False,False,False]
df['sex'] = ['male','female','male','male','female','female']
df
行分组透视表 设置index参数
列分组透视表 设置columns参数
行列分组的透视表 同时设定index、columns参数
fill_value:替换结果中的缺失值
# 男性的平均年龄 和 女性的平均年龄
df.groupby('sex').groups
df.groupby('sex')['age'].mean()
df.groupby('sex')[['age','height','smoke','weight']].mean()
# 透视表
pd.pivot_table(df,index='sex')
pd.pivot_table(df,columns='sex')
交叉表
是一种用于计算分组频率的特殊透视图,对数据进行汇总
pd.crosstab(index,colums)
- index:分组数据,交叉表的行索引
- columns:交叉表的列索引
# 男性和女性 吸烟和不吸烟 的人数
pd.crosstab(index=df.sex,columns=df.smoke)
pd.crosstab(index=df.smoke,columns=df.sex)
matplotlib
目录
一、Matplotlib基础知识
-
二、设置plot的风格和样式
- 1、点和线的样式
- 2、同时设置多个曲线样式
- 3、曲线样式的三种设置方式
- 4、X、Y轴坐标刻度
-
三、2D图形
- 1、示例
- 2、【重点】直方图
- 3、【重点】条形图
- 4、【重点】饼图
- 5、【重点】散点图
=============以上为重点=================
-
四、图形内的文字、注释、箭头
- 1、图形内的文字
- 2、注释
- 3、箭头
-
五、3D图
- 1、曲面图
一、Matplotlib基础知识
Matplotlib中的基本图表包括的元素
x轴和y轴 axis 水平和垂直的轴线
轴标签 axisLabel 水平和垂直的轴标签
x轴和y轴刻度 tick 刻度标示坐标轴的分隔,包括最小刻度和最大刻度
x轴和y轴刻度标签 tick label 表示特定坐标轴的值
绘图区域(坐标系) axes 实际绘图的区域
画布 figure 呈现所有的坐标系
只含单一曲线的图¶
# 正弦曲线
# 先获取x -π到π
x = np.arange(-np.pi,np.pi,0.1) # [start,] stop[, step,] 开始值 结束值 步长值
x
y = np.sin(x)
y
plt.plot(x,y) # plot(x, y) 最简单的参数形式 传入x和y的值
包含多个曲线的图
1、可以使用多个plot函数(推荐),在一个图中绘制多个曲线
# 绘制两个图 一个是 -π到0 另一个是0到π
x1 = np.arange(-np.pi,0,0.1)
x2 = np.arange(0,np.pi,0.1)
# 方式一:多次使用 plt.plot绘制多个函数
plt.plot(x1,np.sin(x1))
plt.plot(x2,np.sin(x2))
2、也可以在一个plot函数中传入多对X,Y值,在一个图中绘制多个曲线
x1 = np.arange(-np.pi,0,0.1)
x2 = np.arange(0,np.pi,0.1)
# 方式二 调用一次plt.plot里面传入多个x和y的值 plt.plot(x1,y1,x2,y2,...xn,yn)
plt.plot(x1,np.sin(x1),x2,np.sin(x2))
子画布¶
# 先调整一下画布大小
plt.figure(figsize=(8,8))
# For example, ``subplot(2, 3, 3)`` and ``subplot(233)``
# subplot(2, 3, 3) 创建一个子画布 把原来的大的画布 上下分成2部分 左右分成3部分 占用哪个部分
# axes1 = plt.subplot(2,2,1) # 根据传入的参数创建子画布 返回坐标系对象
# axes2 = plt.subplot(2,2,2)
# axes3 = plt.subplot(2,2,3)
# axes4 = plt.subplot(2,2,4)
axes1 = plt.subplot(4,2,1) # 根据传入的参数创建子画布 返回坐标系对象
axes2 = plt.subplot(4,2,4)
axes3 = plt.subplot(2,2,3)
axes4 = plt.subplot(2,2,4)
# 接下来注意 是在每一个小的坐标系上绘图 而不是在大的画布上绘图 所以 是用对应的axes对象来调用plot
axes1.plot(x,np.sin(x))
axes2.plot(x,np.cos(x))
axes3.plot(x,np.tan(x))
axes4.plot(x,np.tanh(x))
网格线
使用plt.grid方法可以开启网格线,使用plt面向对象的方法,创建多个子图显示不同网格线
- axis显示轴向
- color代表颜色
- alpha表示线的明暗程度
- lw代表linewidth,线的粗细
plt.figure(figsize=(8,8))
axes1 = plt.subplot(221)
axes2 = plt.subplot(222)
axes3 = plt.subplot(223)
axes4 = plt.subplot(224)
# 给坐标系添加网格
# plt.grid() # 注意plt.grid()确实可以绘制网格线 但是如果有子画布 plt.grid只会给离他最近的那个子画布绘制网格线
axes1.grid() # axis='both' 默认水平竖直方向都有网格线
axes2.grid(axis='x') # 在轴上方绘制网格线
axes3.grid(axis='y')
axes4.grid(color='red',linewidth=2,alpha=0.2)
坐标轴的轴线
plt.axis([xmin,xmax,ymin,ymax])
# 绘制圆形
x = np.linspace(-1,1,100)
x
# x**2+y**2=1
# y**2=1-x**2
# y=(1-x**2)**0.5
y=(1-x**2)**0.5
plt.plot(x,y)
plt.plot(x,-y)
plt.axis([-2,2,-2,2]) # [x轴的起始值,x轴的结束值,y轴的起始值,y轴的结束值]
plt.axis([-1.5,1,-5,3])
# plt.axis([0.5,0.5,1,1])
plt.axis('xxx') 'off'、'equal'……
设置坐标轴类型
关闭坐标轴
x = np.linspace(-1,1,100)
x
# x**2+y**2=1
# y**2=1-x**2
# y=(1-x**2)**0.5
y=(1-x**2)**0.5
plt.plot(x,y)
plt.plot(x,-y)
plt.axis('equal') # 让x轴和y轴等长
plt.axis('off')
xlim方法和ylim方法
除了plt.axis方法,还可以通过xlim,ylim方法设置坐标轴范围
x = np.linspace(-1,1,100)
x
# x**2+y**2=1
# y**2=1-x**2
# y=(1-x**2)**0.5
y=(1-x**2)**0.5
plt.plot(x,y)
plt.plot(x,-y)
plt.xlim([-3,3])
plt.ylim([-2,2])
坐标轴的标签
plt.xlabel( )方法 和 plt.ylabel( )方法
例如 plt.ylabel('y = x^2 + 5',rotation = 60)
- color 标签颜色
- fontsize 字体大小
- rotation 旋转角度
# 正弦曲线
x = np.arange(-np.pi,np.pi,0.1)
x
y = np.sin(x)
plt.plot(x,y)
# s x标签的内容
plt.xlabel('x')
plt.ylabel('f(x)=sin(x)')
plt.xlabel('x',color='orange',fontsize=20,rotation=20)
plt.ylabel('f(x)=sin(x)',rotation=20)
plt.ylabel('f(x)=sin(x)',rotation=90) # y轴标题 默认就是旋转了90度
画布的标题
plt.title()方法
- loc 标题位置{left,center,right}
- color 标题颜色
- fontsize 字体大小
- rotation 旋转角度
# 正弦曲线
x = np.arange(-np.pi,np.pi,0.1)
x
y = np.sin(x)
plt.plot(x,y)
# 参数 s标题的内容
# plt.title('Sin(x)')
# plt.title('Sin(x)',color='red',fontsize=25,rotation=45)
# loc : {'center', 'left', 'right'},
# plt.title('Sin(x)',color='red',fontsize=25,rotation=45,loc='left')
plt.title('Sin(x)',color='red',fontsize=25,rotation=45,loc='right') # 默认在中间
图例
legend方法
两种传参方法:
- 分别在plt.plot( )函数中增加label参数,再调用plt.legend( )方法显示
- 直接在legend方法中传入字符串列表 如:plt.legend(['normal','fast','slow'])
# 方式一 plt.plot()中传入名字
x = np.linspace(0,10,101)
x
plt.plot(x,x,label='normal')
plt.plot(x,2*x,label='fast')
plt.plot(x,x/2,label='slow')
plt.legend()
# 方式二 把名字一起传入 plt.legend()中
x = np.linspace(0,10,101)
x
plt.plot(x,x)
plt.plot(x,2*x)
plt.plot(x,x/2)
plt.legend(['normal','fast','slow'])
loc参数¶
- loc参数用于设置图例的位置,一般在legend函数内
- matplotlib已经预定义好几种数字表示的位置
字符串 数值 字符串 数值
best 0 center left 6
upper right 1 center right 7
upper left 2 lower center 8
lower left 3 upper center 9
lower right 4 center 10
right 5
loc参数还可以是2元素的列表,表示图例左下角的坐标
[0,0] 左下
[0,1] 左上
[1,0] 右下
[1,1] 右上
图例也可以超过图的界限loc = (-0.1,0.9)
data = np.random.randint(0,100,size=(10,3))
df = DataFrame(data,columns=list('ABC'))
df
plt.plot(df['A'])
plt.plot(df['B'])
plt.plot(df['C'])
# loc参数 The location of the legend 设置图例的位置
# plt.legend(['1','2','3'],loc=0) #
# plt.legend(['1','2','3'],loc=1)
# plt.legend(['1','2','3'],loc=2)
# plt.legend(['1','2','3'],loc=10)
# plt.legend(['1','2','3'],loc=[1,1])
# plt.legend(['1','2','3'],loc=[0,1])
# plt.legend(['1','2','3'],loc=[0,0])
# plt.legend(['1','2','3'],loc=[1,0])
plt.legend(['1','2','3'],loc=[1.2,-0.5])
ncol参数
ncol控制图例中有几列,在legend中设置ncol,需要设置loc
data = np.random.randint(0,100,size=(10,3))
df = DataFrame(data,columns=list('ABC'))
df
plt.plot(df['A'])
plt.plot(df['B'])
plt.plot(df['C'])
# plt.legend(ncol=2)
plt.legend(ncol=3)
二、设置plot的风格和样式
plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色、线型、点型等要素,语法形式为:
plt.plot(X, Y, 'format', ...)
点和线的样式
颜色
- 参数color或c
- 颜色值的方式
- 合法的HTML颜色名
- color = 'red'
- 别名
- color='r'
- HTML十六进制字符串
- color = '#eeefff'
- 归一化到[0, 1]的RGB元组
- color = (0.3, 0.3, 0.4)
颜色 别名 HTML颜色名 颜色 别名 HTML颜色名
蓝色 b blue 绿色 g green
红色 r red 黄色 y yellow
青色 c cyan 黑色 k black
洋红色 m magenta 白色 w white
- color = (0.3, 0.3, 0.4)
- 合法的HTML颜色名
x = np.linspace(-np.pi,np.pi,100)
x
# 设置颜色
# plt.plot(x,np.sin(x),color='red')
# plt.plot(x,np.sin(x),c='red')
# plt.plot(x,np.sin(x),c='r')
# plt.plot(x,np.sin(x),c='g')
# plt.plot(x,np.sin(x),c='#aabbcc')
plt.plot(x,np.sin(x),c=(1,0.2,0.5))
透明度
plt.plot() 中的 alpha参数
x = np.linspace(-np.pi,np.pi,100)
plt.plot(x,np.sin(x),c=(1,0.2,0.5),alpha=0.2) # 取值范围0-1
背景色
设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标系的背景色
x = np.linspace(-np.pi,np.pi,100)
# plt.plot(x,np.sin(x),c=(1,0,0)) # 注意 facecolor='gray' 不是plt.plot()的参数
plt.subplot(facecolor='gray') # 一定要注意 先画背景色 再划线 否则背景色就把线给盖住了
plt.plot(x,np.sin(x),c=(1,0,0))
线型和线宽
- 参数linestyle或ls
- linewidth或lw参数
线条风格 | 描述 | 线条风格 | 描述 |
---|---|---|---|
'-' | 实线 | ':' | 虚线 |
'--' | 破折线 | 'steps' | 阶梯线 |
'-.' | 点划线 | 'None' / ',' | 什么都不画 |
x = np.arange(0,10,1)
x
# linestyle 线的样式
# plt.plot(x,x,linestyle='-')
# plt.plot(x,x,linestyle=':') # dotted
# plt.plot(x,x,linestyle='--') # dashed
# plt.plot(x,x,linestyle='-.')
# plt.plot(x,x,linestyle='steps')
# plt.plot(x,x,linestyle='None')
# plt.plot(x,x,linestyle='--',linewidth=5)
plt.plot(x,x,ls='--',lw=5) # ls linestyle 线的样式 lw linewidth 线的宽度
破折线
dashes参数 eg.dashes = [20,50,5,2,10,5]
设置破折号序列各段的宽度
x = np.arange(-np.pi,np.pi,0.1)
y = np.sin(x)
# plt.plot(x,y,dashes=[10]) # 必须是偶数个值 否则会报错
# plt.plot(x,y,dashes=[10,10]) # 实现长10 间隙长10
# plt.plot(x,y,dashes=[10,5,5,2])
# plt.plot(x,y,dashes=[2,4,3,5,10,5])
点型
- marker 设置点形
- markersize 设置点形大小
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
'1' | 一角朝下的三脚架 | '3' | 一角朝左的三脚架 |
'2' | 一角朝上的三脚架 | '4' | 一角朝右的三脚架 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
's' | 正方形 | 'p' | 五边形 |
'h' | 六边形1 | 'H' | 六边形2 |
'8' | 八边形 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
'.' | 点 | 'x' | X |
'*' | 星号 | '+' | 加号 |
',' | 像素 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
'o' | 圆圈 | 'D' | 菱形 |
'd' | 小菱形 | '','None',' ',None | 无 |
标记 | 描述 | 标记 | 描述 | |
---|---|---|---|---|
'_' | 水平线 | ' | ' | 竖线 |
标记 | 描述 | 标记 | 描述 |
---|---|---|---|
'v' | 一角朝下的三角形 | '<' | 一角朝左的三角形 |
'^' | 一角朝上的三角形 | '>' | 一角朝右的三角形 |
x = np.arange(1,10,1)
x
y = np.sin(x)
# plt.plot(x,y)
# plt.plot(x,y,marker='1',markersize=20)
# plt.plot(x,y,marker='2',markersize=20)
# plt.plot(x,y,marker='1',markersize=20)
# plt.plot(x,y,marker='h',markersize=20)
# plt.plot(x,y,marker='H',markersize=20)
# plt.plot(x,y,marker='*',markersize=20)
# plt.plot(x,y,marker='|',markersize=20)
# plt.plot(x,y,marker='_',markersize=20)
x = np.arange(1,10,1)
x
y = np.sin(x)
plt.plot(x,y,marker='h',markersize=20,markeredgecolor='red',markeredgewidth=5,markerfacecolor='green')
更多点和线的设置
- markeredgecolor = 'green',
- markeredgewidth = 2,
- markerfacecolor = 'purple'
参数 | 描述 | 参数 | 描述 |
---|---|---|---|
color或c | 线的颜色 | linestyle或ls | 线型 |
linewidth或lw | 线宽 | marker | 点型 |
markeredgecolor | 点边缘的颜色 | markeredgewidth | 点边缘的宽度 |
markerfacecolor | 点内部的颜色 | markersize | 点的大小 |
x = np.arange(1,10,1)
x
y = np.sin(x)
plt.plot(x,y,marker='h',markersize=20,markeredgecolor='red',markeredgewidth=5,markerfacecolor='green')
在一条语句中为多个曲线进行设置
多个曲线同一设置
属性名声明,不可以多参数连用
plt.plot(x1, y1, x2, y2, ...)
# 同时设置多个曲线的样式 (多个曲线样式相同)
x = np.linspace(0,100,30) # 0-100要30个
x
# plt.plot(x1,y1,x2,y2,x3,y3...) 颜色 点的形状 线的样式
plt.plot(x,x,x,2*x,x,x/2,c='r',marker='*',ls=':')
多个曲线不同设置
多个都进行设置时,多参数连用 plt.plot(x1, y1, fmt1, x2, y2, fmt2, ...)
# 同时设置多个曲线的样式 (多个曲线样式不同)
x = np.linspace(0,100,30) # 0-100要30个
x
# plt.plot(x1, y1, fmt1, x2, y2, fmt2, ...) fmt format 格式 格式化字符串 就是按照人家指定的格式去设置样式的字符串
# fmt = '[color][marker][line]' '颜色 点的样式 线的样式'
plt.plot(x,x,'ro:',x,2*x,'k*--',x,x/2,'c1-.') # 青色 1 -.
三种设置方式
向方法传入关键字参数
plt.plot(...)
就是之前我们一直用的 调用plt.plot()绘图的时候往里面传参数的方式
优点:简洁方便 缺点:容易乱 没提示 可读性差
对坐标系使用一系列的setter方法
- axes = plt.subplot()获取坐标系
- set_title()
- set_facecolor()
- set_xticks、set_yticks 设置刻度值
- set_xticklabels、set_yticklabels 设置刻度名称
x = np.linspace(0,100,30) # 0-100要30个
x
axes = plt.subplot()
axes.plot(x,x,x,2*x,x,x/2)
axes.set_title('title')
axes.set_facecolor('gray')
axes.set_xlabel('x')
axes.set_ylabel('y')
对实例使用一系列的setter方法
- plt.plot()方法返回一个包含所有线的列表,设置每一个线需要获取该线对象
- eg: lines = plt.plot(); line = lines[0]
- line.set_linewith()
- line.set_linestyle()
- line.set_color()
x = np.linspace(0,100,30) # 0-100要30个
x
lines = plt.plot(x,x,x,2*x,x,x/2)
lines[0].set_linewidth(5)
lines[1].set_linestyle(':')
lines[2].set_color('y')
X、Y轴坐标刻度
plt.xticks()和plt.yticks()方法
- 需指定刻度值和刻度名称 plt.xticks([刻度列表],[名称列表])
- 支持fontsize、rotation、color等参数设置
正弦余弦
x = np.linspace(-np.pi,np.pi,100)
x
plt.plot(x,np.sin(x))
# plt.xticks([-3,0,3]) # x轴线上的刻度
# plt.xticks([-np.pi,0,np.pi])
# plt.xticks([-np.pi,0,np.pi],['-π',0,'π'])
# plt.yticks([-1,0,1])
plt.xticks(np.arange(-4,5,2))
plt.grid()
# 关于grid密度的问题
x = np.arange(-np.pi, np.pi, step=0.1)
plt.plot(x,np.sin(x))
# plt.xticks(np.arange(-4,4,0.5))
plt.xticks(np.arange(-4,4,1))
plt.grid()