python 数据分析 |4. 数据可视化-Matplotlib

目录

1.Matplotlib中的绘图的基本使用

2.figure与axes

3.Matplotlib中面向对象与类Matlab语法的区别

4.修改坐标轴属性

5.修改图形属性

6.定制图例,添加标注

7.子图

8.利用Matplotlib绘制各种图形


Matplotlib是Python的一个绘图库,它包含了大量的工具,也提供了极大的灵活性,理论上使用者可以利用它绘制任何图形。

Jupyter Notebook中几乎所有利用Matplotlib绘图的代码都会包含下面两句。

import matplotlib.pyplot as plt # 是整个Matplotlib库的核心,包含了所有绘图相关的函数
%matplotlib inline  # 所有绘图将在Notebook中自动显示

1.Matplotlib中的绘图的基本使用

# 设置图形的长与宽
plt.figure(figsize=(12,9))

# 设置绘图时显示的X轴和Y轴的返回
plt.xlim(0,12)
plt.ylim(0,12)

# 显示中文标签
plt.rcParams['font.sans-serif'] = ['SimHei']

# 坐标轴有负好的时候可以显示负号
plt.rcParams['axes.unicode_minus'] =False

# plt.plot(x,y,format) 的参数使用,这个函数有3个基本输入项
# format包含以下3种参数的组合:{color}{marker}{line}。
# “go-”依次代表的是绿色(对应g),对应(x,y)处画点(对应o),各个点间用线连接(对应-)。
# 如果给出的format组合是“go”,此时就将得到绿色散点图。
# r*--:带红色星型点的虚线,r代表红色,*代表星型,--代表虚线。
# ks.:带黑色方块点的实线,k代表黑色,s代表方块,.代表点。
# bD-.:带蓝色钻石点的点画线,b代表蓝色,D代表钻石点,-.代表点画线。

# 画红色散点图
plt.plot([1,2,3,4,5],[1,2,3,6,10],'ro');

# 画两幅红色散点图
plt.plot([1,2,3,4,5],[1,2,3,6,10],'g*');
plt.plot([2,5,6,8,9],[5,3,7,9,11],'bD');

# label参数给出了图例信息
plt.plot([1,2,3,4,5],[1,2,3,6,10],'g*',label="Green Star");
plt.plot([2,5,6,8,9],[5,3,7,9,11],'bD',label="Blue Diamond");

# plt.legend(loc='best')给出图例的位置
plt.legend(loc='best')

# 图形的标题
plt.title("Scatterplot With Legend")

# 给出了两个坐标轴的名称
plt.xlabel('X')
plt.ylabel('Y')

2.figure与axes

figure想象成绘画的画布,在Matplotlib中每幅图都是在figure上面绘制的,这个对象包含了所有的子图以及图形元素

axes用于创建特定的图形

# 创建一个有两个子图的figure对象,返回值包括了figure对象以及axes对象列表。sharey=True参数表示两个子图共用Y轴,dpi参数表示分辨率,指每英寸长度上的点数

fig,(ax1,ax2) = plt.subplots(1,2,figsize=(6,4),sharey=True,dpi=120)

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

ax1.plot([1,2,3,4,5],[1,2,3,6,10],'g*')
ax2.plot([2,5,6,8,9],[5,3,7,9,11],'bD')

# ax1.set_title("绿星散点图");ax2.set_title("蓝钻散点图")

# ax1.set_xlabel('x');ax2.set_xlable('x')
# ax1.set_ylabel('y');ax2.set_ylable('y')

# ax1.set_xlim(0,12);ax2.set_xlim(0,12)
# ax1.set_ylim(0,12);ax2.set_ylim(0,12)

# plt.xlabel()对应ax.set_xlabel(),plt.ylabel()对应ax.set_ylabel(),plt.xlim()对应ax.set_xlim(),plt.ylim()对应ax.set_ylim() 可以通过axes对象的set()函数

ax1.set(title='绿星',xlabel='x',ylabel='y',xlim=(0,12),ylim=(0,12))
ax2.set(title='蓝钻',xlabel='x',ylabel='y',xlim=(0,12),ylim=(0,12))

plt.tight_layout()
plt.show()

3.Matplotlib中面向对象与类Matlab语法的区别

Matplotlib中有两种不同的绘图语法。一种是类似Matlab的语法,另一种是面向对象语法.                面向对象和类Matlab语法的区别就是面向对象是在指定axes对象上面绘图,而类Matlab语法中所有的绘图则是使用的plt()在当前那个axes对象上绘制.

使用类Matlab的语法绘制两幅并列的图。代码如下

plt.figure(figsize=(6,4),dpi=120)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
# 左边子图
plt.subplot(1,2,1) #(行,列,第几个子图)
plt.plot([1,2,3,4,5],[1,2,3,6,10],'g*')
plt.title('绿星散点图')
plt.xlabel('x');plt.ylabel('y')
plt.xlim(0,12);plt.ylim(0,12)

# 右边子图
plt.subplot(1,2,2) #(行,列,第几个子图)
plt.plot([2,5,6,8,9],[5,3,7,9,11],'bD')
plt.title('蓝钻散点图')
plt.xlabel('x');plt.ylabel('y')
plt.xlim(0,12);plt.ylim(0,12)

plt.show()

Matplotlib中提供了plt.gca()和plt.gcf()函数来获取当前axes和figure。而plt.cla()和plt.clf()函数则可以清除当前axes和figure。

import numpy as np
from numpy.random import seed,randint
import matplotlib.pyplot as plt # 是整个Matplotlib库的核心,包含了所有绘图相关的函数
%matplotlib inline
seed(10)
# 创建figure ,subplots
fig,axes = plt.subplots(2,2,figsize=(20,8),sharex=True,sharey=True,dpi=120)
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来正常显示中文
# 定义要使用的颜色与标记
colors = {0:'g',1:'b',2:'r',3:'y'}
markers = {0:'o',1:'x',2:'*',3:'p'}

#绘制各子图
for i,ax in enumerate(axes.ravel()):
    ax.plot(sorted(randint(0,10,10)),sorted(randint(0,10,10)),marker=markers[i],color=colors[i])
    # plt.title()是给当前的子图添加标题
    ax.set_title('Ax: '+ str(i))
   
    # ax.yaxis.set_ticks_position('none')使得Y轴不绘制刻度标记
    ax.yaxis.set_ticks_position('none')

    # plt.suptitle()函数为整个绘图添加一个标题
plt.suptitle('有4幅子图的图形',verticalalignment='bottom',fontsize=10)
plt.tight_layout()
plt.show()

4.修改坐标轴属性

使用Matplotlib中对各图形属性进行调节。经常用到的关于坐标轴以及标签的修改方法如下:

        修改坐标轴的刻度位置以及标签(plt.xticks()/ax.setxticks()/ax.setxticklabels())。

        控制坐标轴的刻度显示位置(上/下/左/右),使用plt.tick_params()。

        格式刻度标签

画正弦余弦曲线 图代码如下:

#plt.xticks(),设置X轴的刻度和标签,一次完成了X轴的刻度、标签字体、方向等的设置,实际上底层也是通过调用ax.set_xticks()和ax.set_xticklabels()来实现。

#plt.tick_params()函数,是对每个坐标轴的刻度进行了设置,这里设置了每个轴(上/下/左/右)都显示主刻度标记,同时标记显示在内部(direction='in'),网格采用蓝色虚线。

import numpy as np
from matplotlib.ticker import FuncFormatter # 函数格式化程序 
import matplotlib.pyplot as plt # 是整个Matplotlib库的核心,包含了所有绘图相关的函数
%matplotlib inline

plt.rcParams['axes.unicode_minus'] = False  # 当坐标轴有负号的时候可以显示负号
def rad_to_degrees(x,pos):
    # 角度弧度转换
    # 两个参数分别是值与tick位置
    return round(x*57.2985,2)

plt.figure(figsize=(12,7),dpi=100)

#0-2pi间均生产1000个点
X=np.linspace(0,2*np.pi,1000)
plt.plot(X,np.sin(X))
plt.plot(X,np.cos(X))

# 1弧度 = 57.2985度
plt.xticks(ticks=np.arange(0,440/57.2985,90/57.2985),fontsize=12,rotation=30,ha='center',va='top')
# tick 参数,每个轴都画刻度,方向是朝内,蓝色网格
plt.tick_params(axis='both',bottom=True,top=True,left=True,right=True,direction='in',which='major',grid_color='blue')
# x轴的弧度转度
formatter = FuncFormatter(rad_to_degrees)
plt.gca().xaxis.set_major_formatter(formatter)
plt.grid(linestyle='--',linewidth=0.5,alpha=0.5)
plt.title('Sin/Cos函数',fontsize=14)
plt.show()

5.修改图形属性

Matplotlib中各图形组件的外观都可以通过其属性进行修改,对应到代码就是通过rcParams进行全局设置。要了解详细的图形属性,可以通过mpl.rcparams()查看,代码如下。

import matplotlib as mpl
mpl.rc_params()

例如设置字体

mpl.rcParams.update({'font.size':18,'font.family':'STixGeneral','mathtext.fontset':'stix'})

如果想恢复原来的设置

mpl.rcParams.update(mpl.rcParamsDefault)

Matplotlib提供了各种设置好的样式供用户选择,通过如下代码,可以查看当前系统中已安装的样式。

plt.style.available

要选择使用哪种样式绘图,只需要在绘图时进行指定即可。例如,如下代码就使用了不同样式进行绘图。

import numpy as np
from matplotlib.ticker import FuncFormatter # 函数格式化程序 
import matplotlib.pyplot as mpl # 是整个Matplotlib库的核心,包含了所有绘图相关的函数
%matplotlib inline

mpl.rcParams.update({'font.size':18,'font.family':'STIXGeneral','mathtext.fontset':'stix'})

def plot_sine_cosine_wave(style='ggplot'):
   
    # plt.style.use(style)函数通过参数style来决定选择的绘图样式。
    plt.style.use(style)
    plt.figure(figsize=(7,4),dpi=80)
    X = np.linspace(0,2*np.pi,1000)
    plt.plot(X,np.sin(X))
    plt.plot(X,np.cos(X))

    # 1弧度 = 57.2985度
    plt.xticks(ticks=np.arange(0,440/57.2985,90/57.2985),labels=[r'$0$',r'$frac{\pi}{2}$',r'$\pi$',r'$frac{3\pi}{2}$',r'$2\pi$'])
    plt.gca().set(ylim=(-1.25,1.25),xlim=(-.5,7))
    plt.title(style,fontsize=18)
    plt.show()
plot_sine_cosine_wave("seaborn-notebook")

6.定制图例,添加标注

图例的设置主要通过plt.legend()函数来完成,可以使用如下代码。

mpl.rcParams.update(mpl.rcParamsDefault)
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.style.use('seaborn-notebook')

plt.figure(figsize=(10,7),dpi=80)
X = np.linspace(0,2*np.pi,1000)
sine_1 = plt.plot(X,np.sin(X))
cosine_1 = plt.plot(X,np.cos(X))
sine_2 = plt.plot(X,np.sin(X+.5))
cosine_2 = plt.plot(X,np.cos(X+.5))

plt.gca().set(ylim=(-1.25,1.25),xlim=(-.5,7))

plt.title('定制图例',fontsize=18)
#修改图例
#frameon指明是否画边框,framealpha指明了边框透明度,ncol指明分成两列,shadow指明是否有阴影,boderpad指明边框厚度,title指明图例标题

plt.legend([sine_1[0],cosine_1[0],sine_2[0],cosine_2[0]],
            ['sin曲线1','cos曲线1','sin曲线2','cos曲线2'],
            frameon=False, # legend border
            framealpha=1,  # transparency of border
            ncol=2,        # num columns
            shadow=True,   # shadow on
            borderpad=1,   # thickness of border
            title='Sin和Cos',
            loc='best')
plt.show()

plt.annotate()函数可以给图形添加标注以及文本说明

plt.text() 可以给图形添加文本说明

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.figure(figsize=(14,7),dpi=120)
X = np.linspace(0,8*np.pi,1000)
sine = plt.plot(X,np.sin(X),color='tab:blue')

#使用ArrowProps 和bbox 设置标注
# plt.annotate()函数通过xy参数决定标注箭头位置,xytext决定了文本位置,bbox指定了文本框的样式,arrowprops指定了箭头的样式,

plt.annotate('峰',xy=(90/57.2985,1.0),xytext=(90/57.2985,1.5),bbox=dict(boxstyle='square',fc='green',linewidth=0.1),fontsize=12,color='white',horizontalalignment='center')

# 文本
# plt.text() 函数则指定了文本位置
for angle in [440,810,1170]:
    plt.text(angle/57.2985,1.05,str(angle)+'\n度',horizontalalignment='center',color='green')

for angle in [270,630,990,1350]:
    plt.text(angle/57.2985,-1.3,str(angle)+'\n度',horizontalalignment='center',color='red')

plt.gca().set(ylim=(-2.0,2.0),xlim=(-.5,26))
plt.title('标注与文本示例',fontsize=18)
plt.show()

7.子图

子图,即在一个图形中包含了多个子图形。通过plt.subplot()函数可以绘制子图,但是此时得到的子图都是一样大小,很多时候绘图需要对子图有更精确的大小控制,此时就需要用到plt.subplot2grid()或plt.GridSpec()函数。

利用plt.subplot2grid()函数代码如下:

fig = plt.figure()
# plt.subplot2grid()函数的第一个参数给出了整个图形是3×3的网格,绘制(0,0)位置子图
# colspan=2代表该子图占列方向两个网格,rowspan=2代表占行方向两个网格
ax1 = plt.subplot2grid((3,3),(0,0),colspan=2,rowspan=2)  # 左上
ax3 = plt.subplot2grid((3,3),(0,2),rowspan=3)            # 右
ax4 = plt.subplot2grid((3,3),(2,0))                      # 左下
ax5 = plt.subplot2grid((3,3),(2,1))                      # 右下

利用plt.GridSpec()函数也可以完成,例如如下代码:

import matplotlib.gridspec as gridspec
fig = plt.figure()
grid = plt.GridSpec(3,3) # 3行3列
plt.subplot(grid[:2,:2])  # 占据两行两列
plt.subplot(grid[:3,2])      # 占据三行一列  
plt.subplot(grid[2:3,0])   # 占据第三行第一列
plt.subplot(grid[2:3,1:2])   # 占据第三行第二列
fig.tight_layout()

在原图形区域中创建一个新的图形区域来放大显示某部分图形

plt.style.use('seaborn-whitegrid')
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常使用中文
plt.rcParams['axes.unicode_minus'] = False
flg,ax = plt.subplots(figsize=(10,6))
x = np.linspace(-0.5,1.,1000)
# 外部图形
ax.plot(x,x**2)
ax.plot(x,np.sin(x))
ax.set(xlim=(-0.5,1.0),ylim=(-0.5,1.2))
flg.tight_layout()

# 内部绘图

# inner_ax=fig.add_axes([0.2,0.55,0.35,0.35]),其中给出的参数依次代表left,bottom,      
# width,height,但它并不是坐标位置,而是figure的百分比,即左边从figure的20%位置开始,下边从55% 
# 位置开始,宽高是figure的35%。

inner_ax = flg.add_axes([0.2,0.55,0.35,0.35])
inner_ax.plot(x,x**2)
inner_ax.plot(x,np.sin(x))
inner_ax.set(title='放大',xlim=(-.2,.2),ylim=(-0.1,.02),yticks=[-0.01,0,0.01,0.02],xticks=[-0.1,0,.1])
ax.set_title('图形内绘图',fontsize=20)
plt.show()

mpl.rcParams.update(mpl.rcParamsDefault)

8.利用Matplotlib绘制各种图形

plt.scatter()函数代表画散点图,同时它提供了更多参数。'area'和'poptotal'分别代

气泡图绘制例子:

import pandas as pd
midwest = pd.read_csv("../data/midwest_filter.csv")
# Plot
# plt.figure()函数中的两个新参数facecolor和edgecolor,分别代表了背景色为白色,边框颜色为黑色。
plt.rcParams['font.sans-serif'] = ['SimHei']
fig = plt.figure(figsize=(14, 7), dpi= 80, facecolor='w', edgecolor='k')

# plt.scatter()函数代表画散点图,同时它提供了更多参数
# 'area'和'poptotal'分别代表了X和Y的取值,而data则指定了对应数据集
# s代表散点大小由'dot_size'列决定,c='popdensity'指定了散点颜色,camp指定了调色板。
plt.scatter('area', 'poptotal', data=midwest, s='dot_size', c='popdensity', 
            cmap='Reds', edgecolors='black', linewidths=.5)

plt.title("气泡图 PopTotal vs Area\n(颜色:'popdensity' & 大小: 'dot_size')", fontsize=16)
plt.xlabel('面积', fontsize=18)
plt.ylabel('人口总数', fontsize=18)

# plt.colorbar()函数会在图形右侧绘制色条
plt.colorbar()
plt.show()

散点图、步进图、箱线图、直方图 代码如下:

scatter()函数完成散点图绘制                                                                                                    step()函数完成步进图绘制                                                                                                          bar()函数完成条形图绘制                                                                                                     fill_between()函数完成区域填充图绘制                                                                                 date_range()函数生成一个时间序列                                                                                             boxplot()函数完成箱线图绘制                                                                                                         hist()函数完成直方图绘制

import pandas as pd
# Setup the subplot2grid Layout
fig = plt.figure(figsize=(10, 5))
ax1 = plt.subplot2grid((2,4), (0,0))
ax2 = plt.subplot2grid((2,4), (0,1))
ax3 = plt.subplot2grid((2,4), (0,2))
ax4 = plt.subplot2grid((2,4), (0,3))
ax5 = plt.subplot2grid((2,4), (1,0), colspan=2)
ax6 = plt.subplot2grid((2,4), (1,2))
ax7 = plt.subplot2grid((2,4), (1,3))
# Input Arrays
n = np.array([0,1,2,3,4,5])
x = np.linspace(0,5,10)
xx = np.linspace(-0.75, 1., 100)
#  散点图绘制
ax1.scatter(xx, xx + np.random.randn(len(xx)))
ax1.set_title("Scatter Plot")
# 步进图绘制
ax2.step(n, n**2, lw=2)
ax2.set_title("Step Plot")
# 条形图绘制
ax3.bar(n, n**2, align="center", width=0.5, alpha=0.5)
ax3.set_title("Bar Chart")
# 区域填充图绘制
ax4.fill_between(x, x**2, x**3, color="steelblue", alpha=0.5);
ax4.set_title("Fill Between");
# 生成一个时间序列
dates = pd.date_range('2018-01-01', periods = len(xx))
ax5.plot(dates, xx + np.random.randn(len(xx)))
ax5.set_xticks(dates[::30])
ax5.set_xticklabels(dates.strftime('%Y-%m-%d')[::30])
ax5.set_title("Time Series")

# 箱线图绘制
ax6.boxplot(np.random.randn(len(xx)))
ax6.set_title("Box Plot")
# 直方图绘制
ax7.hist(xx + np.random.randn(len(xx)))
ax7.set_title("Histogram")
fig.tight_layout()

绘制双Y轴的图形代码如下:

plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_csv('../data/economics.csv')
x = df['date']; y1 = df['psavert']; y2 = df['unemploy']
# 左边 Y 轴对应曲线
fig, ax1 = plt.subplots(1,1,figsize=(16,7), dpi= 80)
ax1.plot(x, y1, color='tab:red')
# 右边 Y 轴对应曲线
ax2 = ax1.twinx() # 新建axes,共享同一x轴
ax2.plot(x, y2, color='tab:blue')
ax1.set_xlabel('年', fontsize=16)
ax1.set_ylabel('储蓄率', color='tab:red', fontsize=16)
ax1.tick_params(axis='y', rotation=0, labelcolor='tab:red' )
# ax2 (right Y axis)
ax2.set_ylabel("# 失业人数(1000)", color='tab:blue', fontsize=16)
ax2.tick_params(axis='y', labelcolor='tab:blue')
ax2.set_title("储蓄率 vs 失业率", fontsize=16)
ax2.set_xticks(np.arange(0, len(x), 60))
ax2.set_xticklabels(x[::60], rotation=90, fontdict={'fontsize':10})
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

马蹄疾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值