python---matplotlib详细教程(完结)
python--matplotlib详细教程
文章每个图都带有案例,欢迎访问!!!
目录
plt.rcParams['font.sans-serif']=['SimHei']解决缺失字体
如何选择合适的图表
绘制简单的折线图
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')
更多推荐
所有评论(0)