Python绘制折线图(一)Matplotlib

892 阅读5分钟

1.初始化导入库并生成测试数据

本文将使用matplotlib进行折线图绘制,以下是导入库和生成测试数据操作。

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
plt.rcParams['font.sans-serif'] = ['fangsong'] 
plt.rcParams['font.size'] = 12 
plt.rcParams['axes.unicode_minus'] = False
date1=pd.date_range('2022/2/5',periods=365)
xx1=np.random.randn(365)
xx=np.array([i/10 for i in range(1,366)])
v1=np.sin(xx)+xx1
v2=np.cos(xx)*2+xx1
v3=xx*3/5+xx1
v4=xx*6/5+xx1
fake=pd.DataFrame({'date':date1,'woxue':v1,'shufen':v2,'youyuan':v3,'duo':v4})

2.折线图

2.1plt.plot()函数参数介绍

x,y:用于绘制横轴纵轴的数据或者名称

fmt:绘制类别,包括点型-线型-颜色

data:数据

其他常用参数(Line2D):

alpha:透明度,标量

color or c:颜色

绘图类型 or ds:{'default', 'steps', 'steps-pre', 'steps-mid', 'steps-post'}, default: 'default'

标志点颜色填充类型 fillstyle:{'full', 'left', 'right', 'bottom', 'top', 'none'}

in_layout:bool

label:标签形式

线型 or ls:{'-', '--', '-.', ':', '', (offset, on-off-seq), ...}

线宽 or lw:浮点型

marker:标志形式

标志点边缘颜色 or mec:颜色

标志点边缘宽度 or mew:浮点数

标志点颜色 or mfc:颜色

标志点可选颜色 or mfcalt:颜色

标志点大小 or ms:浮点型

2.2使用测试数据进行绘图

2.2.1绘制方式

fake1=fake.iloc[:50,]
fake1.head()
.dataframe tbody tr th:only-of-type { vertical-align: middle; }
date woxue shufen youyuan duo
0 2022-02-05 0.284147 2.174322 0.244314 0.304314
1 2022-02-06 2.220938 3.982402 2.142269 2.262269
2 2022-02-07 1.085193 2.700345 0.969672 1.149672
3 2022-02-08 -0.348040 1.104664 -0.497458 -0.257458
4 2022-02-09 1.033683 2.309422 0.854257 1.154257

折线图有三种绘制方式,在只输入一个参数的时候,表示绘制[1,len(fake['woxue'])]与fake1['woxue']的折线图。

plt.plot(fake1['woxue'])
[<matplotlib.lines.Line2D at 0x22641c97130>]

output_9_1.png

另两种绘制方式如下图所示:

fig,ax=plt.subplots(1,2,figsize=(20,6))
ax[0].plot(fake1['date'],fake1['woxue'])
ax[0].set_title("plot(fake1['date'],fake1['woxue'])")
ax[1].plot('date','woxue',data=fake1)
ax[1].set_title("plot('date','woxue',data=fake1)")
plt.show()

output_10_0.png

2.2.2折线线条设置

2.2.2.1线型

线型主要为四种,分别是点虚线,虚线,点划线和实线,以下是图片展示了四种线型的图片。

fig,ax=plt.subplots(2,2,figsize=(20,12))
ax[0][0].plot(fake1['date'],fake1['woxue'],ls=':')
ax[0][0].set_title('点线')
ax[0][1].plot(fake1['date'],fake1['woxue'],ls='-.')
ax[0][1].set_title('点划线')
ax[1][0].plot(fake1['date'],fake1['woxue'],ls='--')
ax[1][0].set_title('虚线')
ax[1][1].plot(fake1['date'],fake1['woxue'],ls='-')
ax[1][1].set_title('实线')
plt.show()

output_13_0.png

2.2.2.2线宽

使用lw参数调整线宽。

plt.figure(figsize=(10,5))
plt.plot(fake1['date'],fake1['woxue'],ls='-',lw=5)
plt.show()

output_15_0.png

2.2.2.3线条颜色

plt.figure(figsize=(10,5))
plt.plot(fake1['date'],fake1['woxue'],ls='-',c='orange')
plt.show()

output_17_0.png

2.2.3折线标志点设置

2.2.3.1设置标志点

plt.figure(figsize=(10,6))
plt.plot(fake1['date'],fake1['woxue'],marker='o')
plt.show()

output_20_0.png

2.2.3.2标志点设置边缘颜色

plt.figure(figsize=(10,6))
plt.plot(fake1['date'],fake1['woxue'],marker='o',mec='black')
plt.show()

output_22_0.png

2.2.3.3改换标志点填充颜色

plt.figure(figsize=(10,6))

plt.plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red')
plt.show()

output_24_0.png

2.2.3.4设置标志点大小

plt.figure(figsize=(10,6))
plt.plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red',ms=10)
plt.show()

output_26_0.png

2.2.3.5标志点填充类型

fig,ax1=plt.subplots(2,2,figsize=(20,12))
ax1[0][0].plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red',fillstyle='left',ms=10)
ax1[0][0].set_title("fillstyle='left'")
ax1[0][1].plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red',fillstyle='right',ms=10)
ax1[0][1].set_title("fillstyle='right'")
ax1[1][1].plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red',fillstyle='bottom',ms=10)
ax1[1][1].set_title("fillstyle='bottom'")
ax1[1][0].plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red',fillstyle='top',ms=10)
ax1[1][0].set_title("fillstyle='top'")
plt.show()

output_28_0.png

2.2.3.6标志点填充可选颜色

plt.figure(figsize=(10,6))
plt.plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red',fillstyle='right',ms=10,mfcalt='green')
plt.show()

output_30_0.png

2.2.4透明度

设置alpha将同时改变线条颜色和标志点颜色的透明度。

plt.figure(figsize=(10,6))
plt.plot(fake1['date'],fake1['woxue'],marker='o',mec='black',mfc='red',fillstyle='right',ms=10,mfcalt='green',c='darkred',alpha=0.5)
plt.show()

output_32_0.png

2.3进阶绘制

2.3.1多条曲线对比

将条线条添加到同一个画布中,如果不设置线型和颜色,会自动变换颜色,添加label,可以用于生成图例。

plt.figure(figsize=(16,6))
plt.plot(fake1['date'],fake1['woxue'],c='red',label='woxue',marker='o',ls='--')
plt.plot(fake1['date'],fake1['shufen'],c='blue',label='shufen',marker='*',ls=':')
plt.plot(fake1['date'],fake1['youyuan'],c='green',label='youyuan',marker='<',ls='-.')
plt.legend()
plt.grid()
plt.show()

output_35_0.png 以下是分层聚合折线图,可以看各个折线的平均水平对比。

plt.figure(figsize=(16,6))
plt.plot(fake1['date'],fake1['woxue'],c='red',label='woxue',marker='o',ls='--')
plt.axhline(np.mean(fake1['woxue']),c='red')
plt.plot(fake1['date'],fake1['shufen'],c='blue',label='shufen',marker='*',ls=':')
plt.axhline(np.mean(fake1['shufen']),c='blue')
plt.plot(fake1['date'],fake1['youyuan'],c='green',label='youyuan',marker='<',ls='-.')
plt.axhline(np.mean(fake1['youyuan']),c='green')
plt.legend()
plt.grid()
plt.show()

output_36_0.png

2.3.2添加标签

添加标签,使用text函数,在每个点的位置添加标签。

plt.figure(figsize=(16,6))
plt.plot(fake1['date'],fake1['woxue'],c='pink',label='woxue',marker='o',mec='k',mfc='b')
for a,b in zip(fake1['date'],fake1['woxue']):
    plt.text(a,b+0.1,str(round(b,3)))
plt.grid()
plt.show()

output_38_0.png

2.3.3阶梯图(步骤图)

阶梯图是折线图的一个变体,可以用于展现不规则时间间隔的数据变化情况。

fig,ax=plt.subplots(4,1,figsize=(16,16))
ax[0].plot(fake1['date'],fake1['woxue'],ds='steps')
ax[0].set_title('默认阶梯图steps')
ax[1].plot(fake1['date'],fake1['woxue'],ds='steps-pre')
ax[1].set_title('前阶梯图steps-pre')
ax[2].plot(fake1['date'],fake1['woxue'],ds='steps-post')
ax[2].set_title('后阶梯图steps-post')
ax[3].plot(fake1['date'],fake1['woxue'],ds='steps-mid')
ax[3].set_title('中阶梯图steps-mid')
plt.show()

以下展示了四种阶梯图。 output_40_0.png

fig,ax=plt.subplots(4,1,figsize=(16,16))
ax[0].plot(fake1['date'],fake1['woxue'],ds='steps')
ax[0].plot(fake1['date'],fake1['woxue'],c='red',label='youyuan',marker='o',ls='-',lw=1)
ax[0].set_title('默认阶梯图')
ax[1].plot(fake1['date'],fake1['woxue'],ds='steps-pre')
ax[1].plot(fake1['date'],fake1['woxue'],c='red',label='youyuan',marker='o',ls='-',lw=1)
ax[1].set_title('前阶梯图')
ax[2].plot(fake1['date'],fake1['woxue'],ds='steps-post')
ax[2].plot(fake1['date'],fake1['woxue'],c='red',label='youyuan',marker='o',ls='-',lw=1)
ax[2].set_title('后阶梯图')
ax[3].plot(fake1['date'],fake1['woxue'],ds='steps-mid')
ax[3].plot(fake1['date'],fake1['woxue'],c='red',label='youyuan',marker='o',ls='-',lw=1)
ax[3].set_title('中阶梯图')
plt.show()

下图是四种阶梯图的生成方式与折线图的对比。

output_41_0.png