matplotlib绘图的完善及美化

it2023-01-25  64

目录

matplotlib绘图的完善及美化

--0、导入基本库--

--1、完善标题--

--2、完善标签(图例标签设置)--

--3、轴标签说明设置--

--4、设置x与y轴的刻度范围--

--5、自定义每个刻度的显示标签--

--6、设置坐标轴的刻度间隔--

--7、网格设置--

--8、颜色,线型,点标记,透明度设置--

--9、添加注解--

--10、给图形上的坐标点添加注释--

--11、其他优化--

--12、图形样式的选择--

--13、绘制面板图、仪表板--

--14、案例--


matplotlib的绘图原理及流程详解,参考公众号上一文:matplotlib的绘图原理及流程详解

matplotlib绘图的完善及美化


--0、导入基本库--

import numpy as npimport pandas as pdimport matplotlib as mplimport 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 warningswarnings.filterwarnings("ignore") #用于排除警告 #用于显示使用库的版本print("numpy_" + np.__version__)print("pandas_" + pd.__version__)print("matplotlib_"+ mpl.__version__)

--1、完善标题--

在每个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)*2figure = 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()

 


--2、完善标签(图例标签设置)--

在做图的时候,尤其是一个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()

--3、轴标签说明设置--

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(

--4、设置x与y轴的刻度范围--

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()

--5、自定义每个刻度的显示标签--

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(

--6、设置坐标轴的刻度间隔--

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()

--7、网格设置--

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)#设置网格线

 


--8、颜色,线型,点标记,透明度设置--

我们可以在绘制图形时,显式指定图形的颜色,点标记或线条形状。具体设置可以查看帮助文档。

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)


--9、添加注解--

我们可以在图形上绘制文本等说明信息(注解)。

方法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()


--10、给图形上的坐标点添加注释--

x,y = list(range(1,13)),np.random.randint(50,100,12)plt.plot(x,y,"b:o",alpha=0.5)#添加xyfor 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")#只添加yfor 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()


--11、其他优化--

还有很多细节可以优化的,这些细节如图片的大小修改,绘图样式设置等,在作图的过程中根据实际需求查阅资料进行修改。


--12、图形样式的选择--

matplotlib可以绘制很多图形折线图、饼图、箱线图、散点图、柱状图等,更具业务需求选择不同图形对应的函数即可,

每种图形的参数都大致相同,可以查看官网图例修改即可https://matplotlib.org/gallery.html


--13、绘制面板图、仪表板--

综合型的多个图形的组合图。

自定义创建figure,自定义创建多个axes(平铺式分布的axes,内嵌式分布的axes),去参考绘图流程的第2,3条。

可视化仪表板,关注公众后续更新!!!


--14、案例--

a = range(1,11)b = np.random.rand(10)c = np.random.rand(10)*2figure = plt.figure(num="案例1",figsize=(16,9),facecolor="grey",edgecolor="blue",frameon=True)font={"family":"SimHei","style":"normal","weight":"normal","color":"black","size":16}aaxes1 = plt.subplot(2,2,1)axes1.plot(a,c,"r:o",alpha=0.5,label="折线图")plt.legend(loc="best")plt.title("图1",fontdict=font)#只添加yfor 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)#只添加yfor 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()

最新回复(0)