目录
matplotlib绘图的完善及美化
--0、导入基本库--
--1、完善标题--
--2、完善标签(图例标签设置)--
--3、轴标签说明设置--
--4、设置x与y轴的刻度范围--
--5、自定义每个刻度的显示标签--
--6、设置坐标轴的刻度间隔--
--7、网格设置--
--8、颜色,线型,点标记,透明度设置--
--9、添加注解--
--10、给图形上的坐标点添加注释--
--11、其他优化--
--12、图形样式的选择--
--13、绘制面板图、仪表板--
--14、案例--
matplotlib的绘图原理及流程详解,参考公众号上一文:matplotlib的绘图原理及流程详解
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt #最常用的绘图库
mpl.rcParams["font.family"]="SimHei" #使用支持的黑体中文字体
mpl.rcParams["axes.unicode_minus"]=False # 用来正常显示负数 "-"
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签
# mpl.rcParams["font.style"]="normal" #设置标签风格,normal 常规(默认)/italic 斜体/oblique 倾斜
# mpl.rcParams["font.size"]=11 #font.size 字体的大小(默认10)
# % matplotlib inline #jupyter中用于直接嵌入图表,不用plt.show()
import warnings
warnings.filterwarnings("ignore") #用于排除警告
#用于显示使用库的版本
print("numpy_" + np.__version__)
print("pandas_" + pd.__version__)
print("matplotlib_"+ mpl.__version__)
在每个axes绘图后都应该添加一个title,使每个axes都有一个标题
默认添加一个title
plt.title("TitleName")
当然可以通过局部设置美化我们的标题
参数说明:
family=['SimHei','STSong','STXihei','NSimSun','STXihei',...]#字体
styles=['normal','italic','oblique']#字体的风格["常规(默认)","斜体字","倾斜自"]
weights=['light','normal','medium','semibold','bold','heavy','black']#字体粗细
color=["white","black","red","blue","yellow","green",...]#字体颜色
size=[10,12,14,15,16,18,22,24,....]#字体大小
案例:
font={"family":"SimHei","style":"normal","weight":"normal","color":"green","size":16}
plt.title("TitleName",fontdict=font)#显示一个中文标题
x = range(1,11)
y = np.random.rand(10)
z = np.random.rand(10)*2
figure = plt.figure(num="案例1",figsize=(16,9),facecolor="red",edgecolor="blue",frameon=True)
font={"family":"SimHei","style":"normal","weight":"normal","color":"green","size":16}
axes1 = plt.subplot(2,2,1)
axes1.plot(x,z,label="折线图")
plt.legend(loc="best")
plt.title("图1",fontdict=font)
axes2 = plt.subplot(2,2,2)
axes2.bar(x,y,label="柱状图")
plt.legend(loc="best")
plt.title("图2",fontdict=font)
axes3 = plt.subplot(2,2,3)
axes3.scatter(x,y)
plt.legend(range(1,11),loc="right",frameon=False,title="散点图",ncol=1)
plt.title("图3",fontdict=font)
axes4 = plt.subplot(2,2,4)
axes4.pie(y)
plt.legend(range(1,11),loc="right",frameon=False,title="饼图",ncol=1)
plt.title("图4",fontdict=font)
plt.show()
在做图的时候,尤其是一个axes中有多个图形对象的时候,必须加上标签,才能区分每个图形表示的是什么。
方法1:在绘图的时候就加上标签,label="标签名称"plt.legend(loc="best")调用生成标签
x,y=list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y,label="2016年")
plt.plot(list(range(1,13)),np.random.randint(50,100,12),label="2017年")
plt.legend(loc="best")#调用生成标签
plt.show()
方法2:绘制完图片后,再使用plt.legend()生成标签
参数说明:
["标签名2","标签名3","标签名3",...]#一个axes中有几个表示不用意义的图就有几个标签名
loc=["best","upper","down","left","right","upperleft","upperright","downleft"...]
#loc控制图例的显示位置,默认为best,即选择一个最好的位置。
frameon=[False,True]#是否显示边框
title="标签组的大标题"#给整个标签组起一个名
ncol=n#n是数字,表示标签组显示成多少个列
案例:
x,y=list(range(1,13)),np.random.randint(50,100,12)
x,y=list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y)
plt.plot(list(range(1,13)),np.random.randint(50,100,12))
plt.legend(["2018年","2019年"],loc="best",frameon=False,title="年降雨量",ncol=2)
plt.show()
plt.xlabel()设置x轴的标签说明。
plt.ylabel()设置y轴的标签说明。
每个axes对象都应该设置轴标签。
当然也可以通过局部设置美化我们的轴标签
案例:
x,y=list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y)
plt.plot(list(range(1,13)),np.random.randint(50,100,12))
plt.legend(["2018年","2019年"],loc="best",frameon=False,title="年降雨量",ncol=2)
font={"family":"SimHei","style":"normal","weight":"normal","color":"green","size":12}
plt.xlabel("月",fontdict=font)
plt.ylabel("降雨量",fontdict=font)
plt.show(
plt.xlim(xmin, xmax)
plt.ylim(ymin, ymax)
x,y=list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y)
plt.plot(list(range(1,13)),np.random.randint(50,100,12))
plt.legend(["2018年","2019年"],loc="best",frameon=False,title="年降雨量",ncol=2)
font={"family":"SimHei","style":"normal","weight":"normal","color":"green","size":12}
plt.xlabel("月",fontdict=font)
plt.ylabel("降雨量",fontdict=font)
plt.xlim(0,12)
plt.ylim(50,120)
plt.show()
plt.xlim([0,12])
plt.xlim(0,12)
plt.xticks([原刻度标签列表],[新的刻度标签列表])
x,y=list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y)
plt.plot(list(range(1,13)),np.random.randint(50,100,12))
plt.legend(["2018年","2019年"],loc="best",frameon=False,title="年降雨量",ncol=2)
font={"family":"SimHei","style":"normal","weight":"normal","color":"green","size":12}
plt.xlabel("月",fontdict=font)
plt.ylabel("降雨量",fontdict=font)
plt.xlim(0,12)
plt.ylim(50,120)
plt.xticks([1,2,3,4,5,6,7,8,9,10,11,12],
["1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"])
plt.show(
from matplotlib.pyplot import MultipleLocator
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
x_major_locator=MultipleLocator(1)
#把x轴的刻度间隔设置为1,并存在变量里
y_major_locator=MultipleLocator(20)
#把y轴的刻度间隔设置为10,并存在变量里
ax=plt.gca()
#ax为两条坐标轴的实例
ax.xaxis.set_major_locator(x_major_locator)
#把x轴的主刻度设置为1的倍数
ax.yaxis.set_major_locator(y_major_locator)
#把y轴的主刻度设置为10的倍数
x,y=list(range(1,13)),np.random.randint(50,100,12)plt.plot(x,y)
plt.plot(list(range(1,13)),np.random.randint(50,100,12))
plt.legend(["2018年","2019年"],loc="best",frameon=False,title="年降雨量",ncol=2)
font={"family":"SimHei","style":"normal","weight":"normal","color":"green","size":12}
plt.xlabel("月",fontdict=font)
plt.ylabel("降雨量",fontdict=font)
plt.xlim(1,12)
plt.ylim(50,110)
from matplotlib.pyplot import MultipleLocator
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
x_major_locator=MultipleLocator(1)
#把x轴的刻度间隔设置为1,并存在变量里
y_major_locator=MultipleLocator(20)
#把y轴的刻度间隔设置为10,并存在变量里
ax=plt.gca()
#ax为两条坐标轴的实例
ax.xaxis.set_major_locator(x_major_locator)
#把x轴的主刻度设置为1的倍数
ax.yaxis.set_major_locator(y_major_locator)
#把y轴的主刻度设置为10的倍数
plt.show()
plt.grid():
可以通过plt的grid方法来设置是否显示网格。
True为显示,False不显示。ax.grid(color='r',linestyle='-',linewidth=2)
color:设置网格线颜色
axis:设置网格线显示x,y或者全部显示(x,y,both)
linestyle:设置网格线形状
linewidth:设置网格线宽度
案例:
plt.grid(True,color="g",axis="both",ls="--",lw=0.5)#设置网格线
我们可以在绘制图形时,显式指定图形的颜色,点标记或线条形状。具体设置可以查看帮助文档。
color(c):线条颜色。
linestyle(ls):线条形状。
linewidth(lw):线宽。
marker:点标记形状。
markersize(ms):点标记的大小。
markeredgecolor(mec):点边缘颜色。
markeredgewidth(mew):点边缘宽度。
markerfacecolor(mfc):点的颜色。
alpha:透明度(0-1之间)
说明:
颜色,点标记与线型可以使用一个组合参数进行设置。
颜色除了可以使用预设简写的字符之外,也可以使用全称(例如red)也可以使用RGB颜色表示。
颜色:[蓝色:'b'/绿色:'g'/红色:'r'/青色:'c'/品红:'m'/黄色:'y'/黑色:'k'/白色:'w']
线型:[直线:'-'/虚线:'--'/点线:':'/点划线:'-.']
点标记:[点:'.'/像素:','/圆:'o'/方形:'s'/三角形:'^']
关于这三种样式的设置有一种简写的方式:颜色,线条样式,点标记样式"颜色线条样式点标记样式"====>
案例:
x,y = list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y,"b:o",alpha=0.5)
plt.plot(x,y,c="g",ls="--",lw=5,marker="o",ms=8,mec="r",mew=3,mfc="y",alpha=0.5)
我们可以在图形上绘制文本等说明信息(注解)。
方法1:普通文本(当前位置)--常用
plt.text():显示文本(基于坐标)如:plt.text(6,0,"年中")
plt.figtext():显示文本(基于图片比例定位,左下角为原点)如:plt.figtext(0.5,0.5,"图片中央")
x,y = list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y,"b:o",alpha=0.5)
plt.text(6,50,"年中")
plt.figtext(0.5,0.5,"图片中央")
plt.show()
方法2:连线位移(添加线条,在指定位置)--不常用
plt.arrow根据起点坐标(x,y)与各自轴的长度(x+dx,y+dy)绘制箭头。
width箭头尾部的宽度。
head_width箭头的宽度。
head_length箭头的长度。
案例:
plt.arrow(6,100,-2,+5,width=0.1,head_width=0.1,head_length=0.1,color="r")
plt.text(4,105,"年中")
x,y = list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y,"b:o",alpha=0.5)
plt.arrow(7,55,-1,-5,width=0.1,head_width=0.5,head_length=0.5,color="r")
plt.text(7,55,"年中")
plt.show(
方法3:箭头与文本--常用
plt.annotate():显示箭头与文本。
xy箭头指向坐标
xytext文本起点坐标。(箭头尾部坐标)
arrowprops字典类型,可设置箭头的属性。
facecolor箭头的颜色
headwidth箭头的宽度
width箭尾的宽度
shrink收缩大小
headlength箭头的长度
arrowstyle一些预设的箭头样式。当含有该参数时,上述4项参数将不再有效。
更多参数的使用方法自行搜索...
案例:
plt.annotate("年中",xy=(6,100),xytext=(4,105),
color="g",size=16,bbox=dict(fc="b",ec="g"),
arrowprops=dict(width=3,facecolor="r",headwidth=10,shrink=0.01,headlength=10))
x,y = list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y,"b:o",alpha=0.5)
plt.annotate("年中",xy=(6,50),xytext=(4,80),color="g",size=16,bbox=dict(fc="b",ec="g"),
arrowprops=dict(width=3,facecolor="r",headwidth=10,shrink=0.01,headlength=10))
plt.show()
x,y = list(range(1,13)),np.random.randint(50,100,12)
plt.plot(x,y,"b:o",alpha=0.5)
#添加xy
for xy in zip(x,y):
plt.annotate("(%s,%s)" % xy, xy=xy, xytext=(-5, +5), textcoords='offset points')
plt.show()
x,y = list(range(1,13)),np.random.randint(50,100,12)
plt.bar(x,y,alpha=0.5,color="c")
#只添加y
for x, y in zip(x, y): # zip是将X,Y1分别传到x,y中,传两个
plt.text(x, y + 0.5, '%.1f' % y, ha='center', va='bottom') # ha,va规定坐标表示的点,默认左下
plt.show()
还有很多细节可以优化的,这些细节如图片的大小修改,绘图样式设置等,在作图的过程中根据实际需求查阅资料进行修改。
matplotlib可以绘制很多图形折线图、饼图、箱线图、散点图、柱状图等,更具业务需求选择不同图形对应的函数即可,
每种图形的参数都大致相同,可以查看官网图例修改即可https://matplotlib.org/gallery.html
综合型的多个图形的组合图。
自定义创建figure,自定义创建多个axes(平铺式分布的axes,内嵌式分布的axes),去参考绘图流程的第2,3条。
可视化仪表板,关注公众后续更新!!!
a = range(1,11)
b = np.random.rand(10)
c = np.random.rand(10)*2
figure = plt.figure(num="案例1",figsize=(16,9),facecolor="grey",edgecolor="blue",frameon=True)
font={"family":"SimHei","style":"normal","weight":"normal","color":"black","size":16}
a
axes1 = plt.subplot(2,2,1)
axes1.plot(a,c,"r:o",alpha=0.5,label="折线图")
plt.legend(loc="best")
plt.title("图1",fontdict=font)
#只添加y
for x, y in zip(a, c): # zip是将X,Y1分别传到x,y中,传两个
axes1.text(x, y + 0.01, '%.1f' % y, ha='center', va='bottom') # ha,va规定坐标表示的点,默认左下
axes2 = plt.subplot(2,2,2)
axes2.bar(a,b,alpha=0.5,color="c",label="柱状图")
plt.legend(loc="best")
plt.title("图2",fontdict=font)
#只添加y
for x, y in zip(a, b): # zip是将X,Y1分别传到x,y中,传两个
axes2.text(x, y + 0.01, '%.1f' % y, ha='center', va='bottom') # ha,va规定坐标表示的点,默认左下
from matplotlib.pyplot import MultipleLocator
#从pyplot导入MultipleLocator类,这个类用于设置刻度间隔
x_major_locator=MultipleLocator(1)
#把x轴的刻度间隔设置为1,并存在变量里
y_major_locator=MultipleLocator(20)
#把y轴的刻度间隔设置为10,并存在变量里
ax=plt.gca()
#ax为两条坐标轴的实例
ax.xaxis.set_major_locator(x_major_locator)
#把x轴的主刻度设置为1的倍数
ax.yaxis.set_major_locator(y_major_locator)
#把y轴的主刻度设置为10的倍数
axes3 = plt.subplot(2,2,3)
axes3.scatter(a,b)
plt.legend(range(1,11),loc="right",frameon=False,title="散点图",ncol=1)
plt.title("图3",fontdict=font)
plt.grid(True,color="g",axis="both",ls="--",lw=0.5)#设置网格线
axes4 = plt.subplot(2,2,4)
axes4.pie(b,autopct='%1.1f%%')
plt.legend(range(1,11),loc="right",frameon=False,title="饼图",ncol=1)
plt.title("图4",fontdict=font)
plt.show()