Python数据分析入门--绘图与可视化学习笔记


前言

在这里插入图片描述

Matplotlib是Python中最常用的可视化工具之一,可以非常方便地创建海量类型地2D图表和一些基本的3D图表,可根据数据集(DataFrame,Series)自行定义x,y轴,绘制图形(线形图,柱状图,直方图,密度图,散布图等等),能够解决大部分的需要。

matplotlib和pandas以及seaborn

1、matplotlib api 入门

1.1 图片与子图

用matplotlib绘制图像前首先要创建一个图片对象(Figure),我们可以通过plt.figure来创建一个新的图片对象,使用plt.figure时可以选择figsize来配置生成图片的大小。subplot方法能快速生成子图,我们用add_subplot的方法来生成一个空白图片

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
plt.show()

在这里插入图片描述

在有了空白幕布之后,我们就可以使用plt.plot函数来进行绘图。绘图时我们可以向plt.plot传递一个数组,或者结合之前学习的numpy和pandas中生成数据的方法来绘图,比如使用numpy随机数生成模块random

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(30,30))
ax1 = plt.plot(np.random.randn(50).cumsum(),'k--')
ax2 = plt.plot(np.random.randn(50).cumsum())
plt.show()

在这里插入图片描述
上面我们向plt.plot函数传递参数"k - -",该选项是用于绘制黑色分段线的。当我们使用add_subplot方法创建一个空白图片后,其实会返回一个AxesSubplot对象,我们就可以直接调用对象的实例方法进行绘图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure(figsize=(30,30))
ax1 = fig.add_subplot(2,2,1)
ax2 = fig.add_subplot(2,2,2)
ax1.hist(np.random.randn(100),bins=20,color='k',alpha=0.3)
ax2.scatter(np.arange(30),np.arange(30)+3*np.random.randn(30))
print(ax1)
print(ax2)
plt.show()


#/usr/bin/python3.8 /home/ljm/PycharmProject/pythoncode1/code1.py 
AxesSubplot(0.125,0.53;0.352273x0.35)
AxesSubplot(0.547727,0.53;0.352273x0.35)

#Process finished with exit code 0

在这里插入图片描述
matplotlib库中的hist方法主要用于绘制柱状图,hist方法中几个常见的参数:x表示每个柱体分布的数据、bins表示柱体的条数、color表示柱体的颜色、rwidth表示柱状图的宽等。matplotlib库中的scatter方法主要用于绘制散点图,scatter方法中几个主要参数:x和y表示x和y坐标的数据、marker控制显示的散点的形状、color表示散点的颜色。

subplots方法能快速生成多个子图,下面是subplots方法的参数选项汇总

参数描述
nrows子图的行数
ncols子图的列数
sharex所有子图使用相同的x轴刻度(调整xlim会影响所有子图)
sharey所有子图使用相同的y轴刻度(调整ylim会影响所有子图)
kw_subplot传递add_subplot的关键字参数字典,用于生成子图
* * fig_kw生成图片时使用额外关键字参数,例如plt.subplots(2,2,figsize=(30,30))

1.2 颜色、标记和线的类型

matplotlib的主函数plot一般是用来绘制线条的,包括直线、折线等。首先向该方法中传递一个数组,我们这里经常用random模块来生成数组,再向方法中传递几个参数:linestyle表示线的类型("–"十分形象的告诉我们它是虚线)、color表示线的颜色(‘‘g’‘是绿色的英文单词首字母)、marker表示标记("o"表示标记数据点),其实‘g–’效果等价于color=‘g’,linestyle=’- -’,都表示绿色虚线。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1,2,figsize=(30,30))
ax1 = fig.add_subplot(1,2,1)
ax2 = fig.add_subplot(1,2,2)
ax1.plot(np.random.randn(30).cumsum(),'g--')
ax2.plot(np.arange(30).cumsum(),color='k',linestyle='dashed',marker='o')
plt.show()

在这里插入图片描述

常用的绘图函数plot里面还可以传递drawstyle参数,该参数主要控制绘图类型,默认情况下的两点间是线性的,当选择为steps-post则两点间会变成台阶式的。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1,1,figsize=(30,30))
plt.plot(np.arange(30).cumsum(),'ko--')
plt.plot(np.arange(30).cumsum(),color='k',linestyle='dashed',marker='o',drawstyle='steps-post',label='steps-post')
plt.show()

在这里插入图片描述

1.3 刻度、标签和图例

大多数图标修饰工作都可以使用程序性的pyplot接口和面向对象的matplotlib API来完成,pyplot接口设计很多交互式使用,包含了像xlim、xticks和xticklabels等方法,这些方法分别控制了绘图范围、刻度位置和刻度标签,它们都可以被创建好的AxesSubplot对象调用为实例方法

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1,1,figsize=(30,30))
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())
ax.set_xticks([0,250,500,750,1000])
ax.set_xticklabels(['a','b','c','d','e'])
plt.show()

在这里插入图片描述

最快速的改变x轴标记的方法是set_xticks和set_xticklabels,set_xticks故名思义就是改变x轴的刻度位置,set_xticklabels则是改变x轴刻度的标签,方便数据的分类,它们可以传递参数rotation表示文字沿x轴正向的旋转角度,还有参数fontsize用于调正字体大小

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1,1,figsize=(30,30))
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum())
ax.set_xticks([0,250,500,750,1000])
ax.set_xticklabels(['a','b','c','d','e'],rotation=20,fontsize='30')
ax.set_yticks([0,25,50,75,100])
ax.set_yticklabels(['one','two','three','four','five'],rotation=15,fontsize='30')
ax.set_title('random roam',fontsize='30')
ax.set_xlabel('letter',fontsize='30')
ax.set_ylabel('number',fontsize='30')
plt.show()

在这里插入图片描述

修改y轴的刻度和标签的方式和x轴一样。除了上面两种改变刻度和标签的方法,还有set_title方法用于编辑图片的标题,set_label方法用于修改整个轴的大标签。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1,1,figsize=(30,30))
ax = fig.add_subplot(1,1,1)
ax.plot(np.random.randn(1000).cumsum(),'k',label='one')
ax.plot(np.random.randn(1000).cumsum(),'g--',label='two')
ax.plot(np.random.randn(1000).cumsum(),'b.',label='three')
ax.legend(loc='best',fontsize=30)
plt.show()

在这里插入图片描述
通过调用ax对象的实例方法legend,就可以自动生成图例。legend方法包含位置参数loc,"best"意思就是自动选择最合适的位置展示图例。

1.4 注释、子图加工和几何图形绘制

注释也是绘图中很重要的一步,它为数据可视化提供更高的可读性。注释中经常包含文本、箭头以及其他的图形,我们可以利用text、arrow和annote等方法来对数据视图添加注释

from datetime import datetime

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
data = pd.read_csv('/home/mw/input/lypysjfx6221/data/data/spx.csv', index_col=0, parse_dates=True)
spx = data['SPX']
spx.plot(ax=ax, style='k-')
crisis_data = [
                 (datetime(2007, 10, 11), 'Peak of bull market'),
                 (datetime(2008, 3, 12), 'Bear Stearns Fails'),
                 (datetime(2008, 9, 15), 'Lehman Bankruptcy')
              ] 
for date, label in crisis_data:
    ax.annotate(label, 
                xy=(date, spx.asof(date) + 50),
                xytext=(date, spx.asof(date) + 200), 
                arrowprops=dict(facecolor='black'),
                horizontalalignment='left', 
                verticalalignment='top')

在这里插入图片描述
书中通过从雅虎财经获得的标普500指数的收盘价绘制了一个图表,并标注了从2008年到2009年金融危机中的重要日期。其中主要用到annotate方法用于在指定的x和y坐标上编辑注释,还有set_xlim和set_ylim方法来设置图标的横纵边界。

利用matplotlib绘制几何图形也十分快捷,首先要生成子图的对象,接着生成图形对象并在不同函数法中传递图形的详细参数即可绘制出来,最后调用add_patch方法将图形对象添加到子图中

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig, axes = plt.subplots(1,1,figsize=(30,30))
ax = fig.add_subplot(1,1,1)
rect = plt.Rectangle(xy=(0.3,0.8),width=0.3,height=0.3,color='b',alpha=0.3)
circ = plt.Circle(xy=(0.8,0.3),radius=0.2,color='g',alpha=0.3)
ploy = plt.Polygon(xy=([0.15, 0.2], [0.1, 0.4], [0.2, 0.6], [0.3, 0.4], [0.25, 0.2]),color='y',alpha=0.3)
ax.add_patch(rect)
ax.add_patch(circ)
ax.add_patch(ploy)
plt.show()

在这里插入图片描述

绘制矩形函数所需的参数:xy表示矩形左下角位置、width,和height分别表示长和宽,angle表示逆时针旋转角度,color设置颜色;绘制类圆形函数所需参数:xy表示圆心坐标,radius表示圆的半径,color设置颜色;绘制多边形函数所需的参数:xy表示端点坐标的元组,color设置颜色。

1.5 图片的保存

我们可以使用plt.savefig方法将图片保存到文件,实现效果等价于对图片对象使用savefig实例方法。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
fig = plt.figure()
plt.plot([1, 2, 3, 4, 5])
plt.savefig('sample.png', dpi=400, bbox_inches='tight')  

dpi为分辨率即每英寸点数,bbox_inches='tight’会除去图片空白部分,以下是savefig方法的参数汇总

参数描述
fname包含文件路径和格式的字符串
dpi每英寸点数的分辨率,默认为100
facecolor,edgecolor子图之外的图形背景颜色,默认为白色
format文件格式
bbox_inches保存的图片范围

2. 使用pandas和seaborn绘图

2.1 绘制折线图

pandas中的Series和DataFrame对象都包含plot属性可用于绘图,默认绘制的是折线图。之前学习的两种对象自身都包含索引,我们再适当利用plot属性中的参数就可以绘制出内容比较丰富的图表

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
s = pd.Series(np.random.uniform(0,100,10),index=np.arange(10))
df = pd.DataFrame(np.random.randint(0,100,(10,3)),columns=['one','two','three'],index=np.arange(10))
s.plot()
df.plot()
plt.show()

在这里插入图片描述

在这里插入图片描述
Series和DataFrame对象传递的行索引都会变成图表中的x轴刻度标签,而DataFrame对象的列索引则会变成对不同折线的标记。以下是两种对象的plot属性参数汇总

Series对象的plot参数描述
label图例标签
ax绘图所用的matplotlib子图对象,默认为活动的子图
style设置图片样式的字符串,比如’g - -’
alpha图片不透明度,从0到1
kind可以是’area’、‘bar’、‘barh’、‘density’、‘hist’、‘kde’、‘line’、‘pie’
logy对y轴使用对数缩放
use_index使用对象索引做刻度标签
rot刻度标签的逆时针旋转角度
xticksx轴刻度值
yticksy轴刻度值
xlimx轴范围
ylimy轴范围
grid展示轴网络
DataFrame对象的plot参数描述
subplots将DataFrame的每一列绘制在独立的子图中
sharexsubplots=True就共享x轴
shareysubplots=True就共享y轴
figsize设置图片尺寸
title设置标题
legend添加子图图例
sort_columns按字母顺序绘制各列

2.2 绘制柱状图

绘制柱状图可能是我们接触到最多的,比如我们经常用柱状图来统计某件商品的日销售,这些都经常出现在高中统计和概率的题目中。依然是调用plot来帮我们绘制柱状图,plot.bar()会将索引作为x轴刻度,plot.barh()会将索引作为y轴刻度

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
s = pd.Series(np.random.uniform(1,20,6))
s.plot.bar(color="b")
plt.xticks(rotation=360)
plt.show()

在这里插入图片描述

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(6, 4),
               index=['one', 'two', 'three', 'four', 'five', 'six'],
               columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df.plot(kind='bar')
plt.legend(loc='best',fontsize=20)
plt.show()

在这里插入图片描述

在DataFrame对象中我们也可以向plot.bar()或者plot.barh()方法中传递参数"stacked=True"来生成堆积柱状图

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(6, 4),
               index=['one', 'two', 'three', 'four', 'five', 'six'],
               columns=pd.Index(['A', 'B', 'C', 'D'], name='Genus'))
df.plot.barh(stacked=True,alpha=0.6)
plt.legend(loc='best',fontsize=20)
plt.show()

在这里插入图片描述

书上列举了有一个非常实用的柱状图案例,通过read_csv模块将收集的派对数据载入,接着按day和size作为轴标签生成交叉表(crosstab),然后通过选取指定区域的数据并将其按列标准化至和为1,进行每天不同规模派对的百分比统计,利用直方图可以清晰地呈现按天统计的不同规模派对的占比,以及几天的不同派对规模的大致变化趋势(这里是指派对规模间的相对增长)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
tips = pd.read_csv('/home/mw/input/lypysjfx6221/data/data/tips.csv')
party_counts = pd.crosstab(tips['day'], tips['size'])
party_counts = party_counts.iloc[:, 2:5]
party_pcts = party_counts.div(party_counts.sum(1).astype(float), axis=0)
party_pcts.plot(kind='bar')
plt.show()

在这里插入图片描述

用seaborn来汇总数据并绘制数据视图也相当快捷,主要使用barplot方法

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
x = ["A","B","C"]
y = [1, 2, 3]
fig = sns.barplot(x, y)
fig.set_title('title of seaborn')
plt.show()

在这里插入图片描述

2.3 绘制直方图和密度图

直方图是一种用于给出值频率的离散显示图,数据点被分为离散的、均匀间隔的柱体,每个柱体高度表示数据点的数量。书中给出一个按星期日期计算的消费百分比的直方图,主要通过plot.hist方法来绘制

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
tips['tip_pct'] = tips['tip'] / tips['total_bill']
tips['tip_pct'].hist(bins=50) 
plt.show()

在这里插入图片描述
密度图是一种展示对观测数据计算产生的连续概率分布的图表,比如最经典的正态分布图像,是一个在数学、物理及工程等领域都非常重要的概率分布,它的定义是若随机变量X服从一个数学期望为μ、方差为σ2的正态分布,记为N(μ,σ2)。其概率密度函数为正态分布的期望值μ决定了其位置,其标准差σ决定了分布的幅度。当μ = 0,σ = 1时的正态分布是标准正态分布。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
comp1 = np.random.normal(0, 1, size=200) 
comp2 = np.random.normal(10, 2, size=200)
values = pd.Series(np.concatenate([comp1, comp2])) 
sns.displot(values,bins=100,color='k')

在这里插入图片描述

利用seaborn的displot方法可以同时绘制直方图和联系密度估计,上面是两个不同标准正态分布的混合

2.4 绘制散点图

点图和散点图可以用于检验两个一维数据序列之间的关系,书中先载入数据集然后计算对数差,然后使用seaborn的regplot方法,该方法可以绘制散点图并拟合一条线性回归曲线

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
macro = pd.read_csv('/home/mw/input/lypysjfx6221/data/data/macrodata.csv')
data = macro[['cpi', 'm1', 'tbilrate', 'unemp']]
trans_data = np.log(data).diff().dropna() 
sns.regplot('m1','unemp',data=trans_data)
plt.title('Changes in log %s vs. log %s' % ('m1', 'unemp'))
plt.show()

在这里插入图片描述

seaborn里面还有一个非常高效的函数pairplot,可以在对角线上放置每个变量的直方图或者密度图像。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
macro = pd.read_csv('/home/mw/input/lypysjfx6221/data/data/macrodata.csv')
data = macro[['cpi', 'm1', 'tbilrate', 'unemp']]
trans_data = np.log(data).diff().dropna() 
sns.pairplot(trans_data,diag_kind='kde',plot_kws={'alpha':0.2})

在这里插入图片描述

总结

以上就是今天matplotlib库学习笔记的内容,本文简单介绍了matplotlib工具的使用,而matplotlib提供了大量能使我们快速便捷地绘制图像的函数和方法,值得更多深入的应用。

  • 6
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

szu_ljm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值