Matplotlib

Matplotlib

2018-08-14  本文已影响14人  仙灵儿

pandas提供了一些用于将表格型数据读取为DataFrame对象的函数,期中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)

# 男性和女性 吸烟和不吸烟 的人数
pd.crosstab(index=df.sex,columns=df.smoke)
pd.crosstab(index=df.smoke,columns=df.sex)

matplotlib

目录

=============以上为重点=================

一、Matplotlib基础知识

Matplotlib中的基本图表包括的元素

只含单一曲线的图

# 正弦曲线
# 先获取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面向对象的方法,创建多个子图显示不同网格线

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)

# 正弦曲线
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()方法

# 正弦曲线
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()中传入名字
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参数

[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', ...)

点和线的样式

颜色

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))

线型和线宽

线条风格 描述 线条风格 描述
'-' 实线 ':' 虚线
'--' 破折线 '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])

点型

标记 描述 标记 描述
'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')

更多点和线的设置

参数 描述 参数 描述
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方法

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方法

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()方法

正弦余弦

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()
上一篇下一篇

猜你喜欢

热点阅读