Matplotlib

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

你可能感兴趣的:(Matplotlib)