matplotlib在同一个figure绘制多条线,或绘制多个子图

大多数人学Python用的第一个绘图库应该都是matplotlib,最简单的绘图方法是用plot,其他参数用默认值,只需要横纵坐标值就可以绘图了。

一、方法思路

要在同一个图里面绘制多条线,只需要创建一个figure,然后不断的进行plot绘制线图,以及线对应的参数设置(可选操作),最后show()一下就可以了:

import matplotlib.pyplot as plt
import random
x = list(range(10))
y1 = [random.randint(0,9) for i in x]
y2 = [random.randint(3,12) for i in x]
plt.figure()
plt.plot(x,y1,'r')
plt.plot(x,y2,'b')
plt.show()

结果图如下:
matplotlib在同一个figure绘制多条线,或绘制多个子图_第1张图片
要在同一个figure绘制多个子图,跟上面同一个图绘制多条线类似,只是在绘制某一个子图上的内容之前,要先用subplot()指定figure的布局和子图的位置

import matplotlib.pyplot as plt
import random
x = list(range(10))
y1 = [random.randint(0,9) for i in x]
y2 = [random.randint(3,12) for i in x]
y3 = [random.randint(3,33) for i in x]
y4 = [random.randint(2,31) for i in x]
plt.figure()
plt.subplot(2,2,1)
plt.plot(x,y1,'r')
plt.subplot(2,2,2)
plt.plot(x,y2,'b')
plt.subplot(2,2,3)
plt.plot(x,y3)
plt.subplot(2,2,4)
plt.plot(x,y4)
plt.show()

结果图如下:
matplotlib在同一个figure绘制多条线,或绘制多个子图_第2张图片

二、运用

当然,上面绘图的随机数没有实际的意义,举个有一点意义的例子,比如有份数据有x、y、diqu三个特征,现在要在同一个图中绘制出各个地区的趋势进行对比。
matplotlib在同一个figure绘制多条线,或绘制多个子图_第3张图片
思路:
获取diqu的所有类别,根据类型筛选每次在图上画线的数据,把plot绘制的过程放在for循环里面,在循环外面show()
code:

import matplotlib.pyplot as plt
import pandas as pd

df = pd.read_excel('test.xlsx')
#获取diqu所有类别
num = sorted(list(set(df['diqu'])))
n = len(num)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
plt.figure()
for i in range(n):
    print(num[i])
    dfs = df[df['diqu']==num[i]]
    plt.plot(dfs['x'],dfs['y'],label=num[i])
    plt.legend()
plt.show()

结果图如下:
matplotlib在同一个figure绘制多条线,或绘制多个子图_第4张图片
这里各类别的横坐标x均是从0开始且量级相同,固可以通过同一个图绘制多条线进行趋势对比,若不同类别的绘图变量x和y的值相差较大,取值大的类别会压缩取值小的类别显示效果,这时可以绘制多个子图来分别查看类别的趋势。

你可能感兴趣的:(python,数据可视化,数据分析)