文章每个图都带有案例,欢迎访问!!!

目录

如何选择合适的图表

绘制简单的折线图 

图表常用设置

颜色设置

线条样式和标记样式

画布设置 

 设置坐标轴标题

plt.rcParams['font.sans-serif']=['SimHei']解决缺失字体

 设置坐标轴刻度

设置坐标轴范围

 设置网格线

添加文本标签和标题

添加图例

添加注释

设置图表与画布边缘间距

设置刻度线 

折线图

案例:台湾疫情数据增长折线图

基本柱状图

 案例:每日新增疫情数

多柱状图

直方图 

饼形图

基本饼形图

分裂饼形图

环形饼图

散点图 

面积图

​热力图

箱型图

​绘制多个子图三种方式

​subplot

​subplots

add_subplot()

图表的保存


如何选择合适的图表

绘制简单的折线图 

matplotlib.pyplot.plot(x,y,format_string,**kwargs)

import matplotlib.pyplot as plt
import pandas as pd
s=pd.date_range(start='2022-08-02',freq='D',periods=10)
df=pd.DataFrame(data=[30,29,33,38,28,26,31,24,19,25],index=s,columns=['温度'])
x=s
y=df['温度']
plt.plot(x,y)
plt.show()

图表常用设置

颜色设置

import matplotlib.pyplot as plt

x=[1,2,3,4,5]

y=[10,15,20,25,30]

plt.plot(x,y,color='r')

y=[5,20,25,30,40]

plt.plot(x,y,color='g')

y=[10,20,30,40,50]

plt.plot(x,y,color='b')

y=[1,20,40,60,80]

plt.plot(x,y,color='y')

plt.show()

线条样式和标记样式

 plt.plot(x,y,color='b',linestyle='-',marker='o',mfc='w')

mfc='w'使样式标记变成空心

import matplotlib.pyplot as plt

x=[1,2,3,4,5]

y=[10,15,20,25,30]

plt.plot(x,y,color='r',linestyle='--')

y=[5,20,25,30,40]

plt.plot(x,y,color='g',linestyle='-')

y=[10,20,30,40,50]

plt.plot(x,y,color='b',linestyle='-.')

y=[1,20,40,60,80]

plt.plot(x,y,color='y',linestyle=':')

plt.show()

 import matplotlib.pyplot as plt

x=[1,2,3,4,5]

y=[10,15,20,25,30]

plt.plot(x,y,color='r',linestyle='--',marker='o')

plt.show()

 plt.plot(x,y,color='b',linestyle='-',marker='o',mfc='w')

画布设置 

import matplotlib.pyplot as plt

plt.figure(num='画布',figsize=(8,6),facecolor='y')

plt.show()

 设置坐标轴标题

- xlabel函数设置x轴坐标轴标题, ylabel函数设置

import matplotlib.pyplot as plt

import pandas as pd

plt.figure(num='温度',figsize=(10,4),facecolor='y')

s=pd.date_range(start='2022-08-02',freq='D',periods=10)

df=pd.DataFrame(data=[30,29,33,38,28,26,31,24,19,25],index=s,columns=['温度'])

x=s

y=df['温度']

plt.rcParams['font.sans-serif']=['SimHei']解决缺失字体

plt.title('天气预报')

plt.xlabel('日期')

plt.ylabel('温度')

plt.plot(x,y,marker='o',mfc='w')

plt.show()

 设置坐标轴刻度

plt.xticks()

plt.yticks() 

import matplotlib.pyplot as plt

import random

plt.rcParams['font.sans-serif']=['KaiTi']

month=[str(i)+'月' for i in range(1,11)]

x=[i for i in range(1,11)]

y=[random.randint(1,10) for i in range(10)]#包含10

plt.xticks(range(1,11),month)

plt.yticks(range(1,11))

plt.plot(x,y,marker='o')

plt.show()

设置坐标轴范围

xlim函数设置x轴坐标轴范围,ylim函数设置y轴坐标轴范围

import matplotlib.pyplot as plt

import random

plt.rcParams['font.sans-serif']=['KaiTi']

month=[str(i)+'月' for i in range(1,11)]

x=[i for i in range(1,11)]

y=[random.randint(1,10) for i in range(10)]#包含10

plt.xticks(range(1,11),month)

plt.yticks(range(1,11))

plt.xlim(1,20)

plt.ylim(1,20)

plt.plot(x,y,marker='o')

plt.show()

 设置网格线

plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')#x y both

import matplotlib.pyplot as plt

import random

plt.rcParams['font.sans-serif']=['KaiTi']

month=[str(i)+'月' for i in range(1,11)]

x=[i for i in range(1,11)]

y=[random.randint(1,10) for i in range(10)]#包含10

plt.xticks(range(1,11),month)

plt.yticks(range(1,11))

plt.plot(x,y,marker='o')

plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')#x y both

plt.show()

添加文本标签和标题

plt.text()

plt.title()

添加图例

plt.legend(('销售次数',))

 #

import matplotlib.pyplot as plt

import random

plt.rcParams['font.sans-serif']=['KaiTi']

month=[str(i)+'月' for i in range(1,11)]

x=[i for i in range(1,11)]

y=[random.randint(1,10) for i in range(10)]#包含10

plt.xticks(range(1,11),month)

plt.yticks(range(1,11))

for a,b in zip(x,y):

        plt.text(a,b,(a,b),color='r',ha='center',fontsize='10')

plt.title('测试练习',fontsize='15',color='b')

plt.plot(x,y,marker='o',mfc='w')

plt.legend(('销售次数',))

plt.show()

添加注释

matplotlib.pyplot.annotate(s,xy,xytext,xycoords,arrowprops) 

 import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['KaiTi']

month=[str(i)+'月' for i in range(1,11)]

x=[1,2,3,4,5,6]

y=[10,18,32,47,8,26]

for a,b in zip(x,y):

         plt.text(a,b,b,color='r',ha='center',fontsize='10')

plt.title('测试练习',fontsize='15',color='b')

plt.plot(x,y,marker='o',mfc='w')

plt.annotate('最大数',xy=(4,47),xytext=(5,47),arrowprops={'facecolor':'y','shrink':0.05}) plt.show()

设置图表与画布边缘间距

matplotlib.pyplot.subplots_adjust(left,right,top,bottom)

plt.subplots_adjust(left=0.1,right=0.9,bottom=0.09,top=0.9)

设置刻度线 

plt.tick_params(bottom=True,left=True,right=True,top=True)#True显示刻度线

plt.rcParams['xtick.direction'] = 'in'  # 将x周的刻度线方向设置向内
plt.rcParams['ytick.direction'] = 'in'  # 将y轴的刻度方向设置向内
plt.rcParams['xtick.direction'] = 'out'  # 将x周的刻度线方向设置向外
plt.rcParams['ytick.direction'] = 'out'  # 将y轴的刻度方向设置向内外
plt.rcParams['xtick.direction'] = 'inout'  # 将x周的刻度线方向设置向中间
plt.rcParams['ytick.direction'] = 'inout'  # 将y轴的刻度方向设置向中间

常用图表—折线图

案例:台湾疫情数据增长折线图

准备数据:通过爬虫获取20200122到今天为止每日的新增病例数量,得到按季度增加的病例数量绘图。

数据文件地址:https://file1.dxycdn.com/2020/0223/045/3398299749526003760-135.json

import pandas as pd
import matplotlib.pyplot as plt
df=pd.read_csv('tw.csv')
for i in range(0,909):
    for j in range(0,1):
       df.iloc[i,j]=str(df.iloc[i,j])
df['dateId']=pd.to_datetime(df['dateId'])
df=df.set_index('dateId')
df=df.resample('Q').sum().to_period('Q')
plt.figure('简单折线图',figsize=(8,6),facecolor='y',)
x=['2020Q1','2020Q2','2020Q3','2020Q4','2021Q1','2021Q2','2021Q3','2021Q4','2022Q1','2022Q2', '2022Q3']
y=list(df['confirmedIncr'])
plt.plot(x, y, color='b', linestyle='-', marker='o', mfc='w')
plt.xlabel('季度')
plt.ylabel('新增数量')
for a,b in zip(x,y):
        plt.text(a,b,b,color='r',ha='center',fontsize='10')
plt.title('疫情新增趋势按季度')
plt.rcParams['font.sans-serif']=['SimHei']
plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')
plt.subplots_adjust(left=0.1,right=0.9,bottom=0.09,top=0.9)
plt.show()

常用图表-基本柱状图

 案例:每日新增疫情数

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import json
import requests
from lxml import etree
plt.rcParams['font.sans-serif'] = ['KaiTi']
url = "https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0"
headers={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.62',
}
res = requests.get(url=url,headers=headers)
res.encoding = "utf-8"
content = res.text
html = etree.HTML(content)
con = html.xpath('//*[@id="fetchRecentStatV2"]/text()')
con = str(con)
begin = con.index("[{")
end = con.index("}catch(e){}']")
con = con[begin : end]
ls = json.loads(con)
# ==============================绘图====================================================
df_data = pd.DataFrame.from_dict(ls)
print(df_data)
def btxzzt():
    ls_provinceShortName = []  # 省份
    ls_yesterdayLocalConfirmedCount= []  # 本土新增确诊
    for x in ls:
        provinceShortName = x["provinceShortName"]
        yesterdayLocalConfirmedCount = x["yesterdayLocalConfirmedCount"]
        ls_provinceShortName.append(provinceShortName)
        ls_yesterdayLocalConfirmedCount.append(yesterdayLocalConfirmedCount)

    x = np.array(ls_provinceShortName)
    y = np.array(ls_yesterdayLocalConfirmedCount)
    plt.figure('基本柱状图',figsize=(8,6),facecolor='y')
    plt.title("近期风险地区疫情本土新增")
    plt.xlabel("省份")
    plt.ylabel("人数")
    plt.yticks(range(0,99))
    for i,j in zip(range(len(y)), y):
        plt.text(i, j, j)#(i,j)表示添加标签的位置,j表示添加的内容
    plt.grid(color='0.5', linestyle='--', linewidth='1', axis='y')
    plt.subplots_adjust(left=0.1, right=0.9, bottom=0.09, top=0.9)
    plt.bar(x, y,width=0.8,alpha=0.5,color='g')
    plt.show()
btxzzt()

 多柱状图

主要代码:

  w=0.2

plt.bar(x, y1,width=0.2,color='g',alpha=0.5)
plt.bar(x+w, y2,width=0.2,color='r',alpha=0.5)
plt.bar(x+2*w, y3,width=0.2,color='b',alpha=0.5)
plt.bar(x+3*w, y4,width=0.2,color='y',alpha=0.5)

 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df=pd.read_excel('多柱状图.xlsx')
plt.figure('多柱状图',facecolor='y',figsize=(10,7))
x=np.array([1,2,3,4,5,6,7])
y1=df['1月']+df['2月']+df['3月']
y2=df['4月']+df['5月']+df['6月']
y3=df['7月']+df['8月']+df['9月']
y4=df['10月']+df['11月']+df['12月']
plt.xlabel('产品')
plt.ylabel('季度销售量')
w=0.2
for i,j in zip(x, y1):
    plt.text(i,j,j,ha='center',color='g')
for i, j in zip(x, y2):
    plt.text(i+0.2, j, j, ha='center', color='r')
for i, j in zip(x, y3):
    plt.text(i+0.4, j, j, ha='center', color='b')
for i, j in zip(x, y4):
    plt.text(i+0.6, j, j, ha='center', color='y')
plt.rcParams['font.sans-serif']=['SimHei']
plt.bar(x, y1,width=0.2,color='g',alpha=0.5)
plt.bar(x+w, y2,width=0.2,color='r',alpha=0.5)
plt.bar(x+2*w, y3,width=0.2,color='b',alpha=0.5)
plt.bar(x+3*w, y4,width=0.2,color='y',alpha=0.5)
data=df['产品名称']
plt.xticks(x,data)
plt.legend(['第一季度','第二季度','第三季度','第四季度'])
plt.subplots_adjust(left=0.08, right=0.98, bottom=0.09, top=0.95)
plt.show()

直方图 

import pandas as pd
import matplotlib.pyplot as plt
df=pd.DataFrame(data={
    '总成绩':[61,71,89,74,36,25,86,73,84,86,87]
})
plt.rcParams['font.sans-serif']=['KaiTi']
x=df['总成绩']
plt.xlabel('分数')
plt.ylabel('人数')
plt.title('直方图')
bins=[0,10,20,30,40,50,60,70,80,90,100]
plt.xticks(bins)
plt.hist(x,bins,facecolor='g',edgecolor='k')
plt.show()

 饼形图

基本饼形图

import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.unicode.east_asian_width', True)
s=pd.DataFrame(data={
    '商品名':['小米手机','华为手机','华为电脑','小米电脑'],
    '销量':[400,200,50,60]
})
plt.rcParams['font.sans-serif']=['KaiTi']
x=s['销量']
labels=s['商品名']
plt.pie(x,labels=labels,autopct='%1.1f%%',labeldistance=1.05,textprops={'fontsize':12})
#保证饼形图为圆形
plt.axis('equal')
plt.legend(labels,fontsize='10')
plt.show()

分裂饼形图

通过在绘制基本饼图中加一个参数explode=(0.1,0,0,0)实现

shadow=True使饼图带有阴影效果,有层次感

import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.unicode.east_asian_width', True)
s=pd.DataFrame(data={
    '商品名':['小米手机','华为手机','华为电脑','小米电脑'],
    '销量':[400,200,50,60]
})
plt.rcParams['font.sans-serif']=['KaiTi']
x=s['销量']
labels=s['商品名']
plt.pie(x,labels=labels,autopct='%1.1f%%',labeldistance=1.05,textprops={'fontsize':12},explode=(0.1,0,0,0),shadow=True)
#保证饼形图为圆形
plt.axis('equal')
plt.legend(labels,fontsize='10')
plt.show()

 

环形饼图

通过参数wedgeprops实现

若要绘制内嵌环形饼图通过设置半径radius实现

import pandas as pd
import matplotlib.pyplot as plt
pd.set_option('display.unicode.east_asian_width', True)
s=pd.DataFrame(data={
    '商品名':['小米手机','华为手机','华为电脑','小米电脑'],
    '北京销量':[400,200,50,60],
    '上海销量':[299,386,79,67]
})
plt.rcParams['font.sans-serif']=['KaiTi']
x=s['北京销量']
x1=s['上海销量']
color=['y','g','r','b']
labels=s['商品名']
plt.pie(x,labels=labels,autopct='%1.1f%%',colors=color,labeldistance=1.05,radius=1,pctdistance=0.85,textprops={'fontsize':12},wedgeprops={'width':0.4,'edgecolor':'w'})
plt.pie(x1,autopct='%1.1f%%',colors=color,labeldistance=1.05,radius=0.7,pctdistance=0.85,textprops={'fontsize':12},wedgeprops={'width':0.4,'edgecolor':'w'})
plt.legend(labels,fontsize='10',frameon=False)
#保证饼形图为圆形
plt.axis('equal')
plt.show()

 

散点图 

import matplotlib.pyplot as plt
import random
x=[i for i in range(1,11)]
y=[random.randint(1,11) for i in range(1,11)]
plt.scatter(x,y,color='r')
plt.show()

面积图

案例中的数据是自己拟的

import matplotlib.pyplot as plt
import pandas as pd
df=pd.read_excel('多柱状图.xlsx')
plt.rcParams['font.sans-serif']=['KaiTi']
x=df['产品名称']
y1=df['1月']+df['2月']+df['3月']
y2=df['4月']+df['5月']+df['6月']
y3=df['7月']+df['8月']+df['9月']
y4=df['10月']+df['11月']+df['12月']
plt.stackplot(x,y1,y2,y3,y4)
plt.legend(['第一季度','第二季度','第三季度','第四季度'])
plt.show()

热力图

import matplotlib.pyplot as plt
import pandas as pd
import  random
df=pd.DataFrame(data={
    '姓名':['小明','小红','张三','李四','小虎'],
    '语文':[random.randint(80,150) for i in range(5)],
    '数学':[random.randint(80,150) for i in range(5)],
    '英语':[random.randint(80,150) for i in range(5)]
})
plt.rcParams['font.sans-serif']=['KaiTi']
x=df.loc[:,'语文':]
plt.yticks(range(5),df['姓名'])
plt.xticks(range(3),['语文','数学','英语'])
plt.title('学生成绩热力图')
plt.imshow(x)
plt.colorbar()#显示颜色条
plt.show()

 箱型图

 绘制多个子图三种方式

 subplot

import matplotlib.pyplot as plt
import random
#绘制第一个子图
plt.subplot(2,2,1)
plt.plot([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
#绘制第一个子图
plt.subplot(2,2,2)
plt.scatter([1,2,3,4,5],[random.randint(1,10) for i in range(5)],color='r')
#绘制第一个子图
plt.subplot(2,1,2)
plt.bar([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
plt.show()

subplots

import matplotlib.pyplot as plt
import random
figure,axes=plt.subplots(2,2)#两行两列
# 第一个绘图区
axes[0,0].plot([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
# 第二个绘图区
axes[0,1].scatter([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
# 第三个绘图区
axes[1,0].bar([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
# 第四个绘图区
axes[1,1].pie([random.randint(1,10) for i in range(5)],autopct='%1.1f%%')
plt.show()

 add_subplot()

import matplotlib.pyplot as plt
import random
fig=plt.figure()
#绘制第一个子图
ax1=fig.add_subplot(2,2,1)
ax1.plot([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
#绘制第二个子图
ax2=fig.add_subplot(2,2,2)
ax2.scatter([1,2,3,4,5],[random.randint(1,10) for i in range(5)],color='r')
#绘制第三个子图
ax3=fig.add_subplot(2,2,3)
ax3.bar([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
# 绘制第四个
ax4=fig.add_subplot(2,2,4)
ax4.pie([random.randint(1,10) for i in range(5)],autopct='%1.1f%%')
plt.show()

 图表的保存

plt.savefig('demo.png')

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐