matplotlib学习

您所在的位置:网站首页 origin90坐标轴刻度不见了 matplotlib学习

matplotlib学习

2023-04-20 22:12| 来源: 网络整理| 查看: 265

设置坐标轴刻度样式

刻度由刻度标签和刻度线组成,若要进一步设置刻度样式,就需要引入刻度定位器(locator)刻度格式器(formatter)的概念。刻度定位器用来设置刻度线的位置;刻度格式器用来设置刻度标签的显示样式

使用定位器和格式器

要使用定位器和格式器,需要先从matplotlib.ticker模块导入类AutoMinorLocator、MultipleLocater和FuncFormatter。接下来构建一个Figure画布对象并向画布添加一个1行1列的子区,从而生成一个Axes实例ax,再分别设置x轴和y轴的主刻度线位置,其中ax.xaxis和ax.yaxis分别获得x轴实例和y轴实例。

import matplotlib.pyplot as plt import numpy as np from matplotlib.ticker import AutoMinorLocator,MultipleLocator,FuncFormatter #设置刻度线向外还是向内 plt.rcParams['xtick.direction'] = 'in' plt.rcParams['ytick.direction'] = 'in' x = np.linspace(0.5,3.5,100) y = np.sin(x) fig = plt.figure(figsize = (8,8)) ax = fig.add_subplot(111) #设置x,y 的主刻度定位器 ax.xaxis.set_major_locator(MultipleLocator(1.0)) ax.yaxis.set_major_locator(MultipleLocator(1.0)) #设置x,y 的次刻度定位器 ax.xaxis.set_minor_locator(AutoMinorLocator(4)) ax.yaxis.set_minor_locator(AutoMinorLocator(4)) #设置x的次刻度格式器 def minor_tick(x, pos): if not x % 1.0: return "" return "%.2f" % x ax.xaxis.set_minor_formatter(FuncFormatter(minor_tick)) #ax.yaxis.set_minor_formatter(FuncFormatter(minor_tick)) #改变刻度和刻度标签的外观 ax.tick_params("x",which="major", length=15,width = 2.0, colors = "0.25") ax.tick_params("y",which="major", length=15,width = 2.0, colors = "0.25") ax.tick_params(which = "minor", length = 5, width = 1.0, labelsize=10,labelcolor = "0.25") #设置x,y轴的范围 ax.set_xlim(0,4) ax.set_ylim(0,2) #在子图画画 ax.plot(x,y,c = (0.25,0.25,1.00),lw = 2,zorder = 10)#pair0 #ax.plot(x,y,c = (0.25,0.25,1.00),lw = 2,zorder = 0)#pair1 #设置网格 ax.grid(linestyle=":",linewidth = 0.5,color = "r",zorder = 0)#pair0 #ax.grid(linestyle="-",linewidth = 0.5,color = "r",zorder = 10)#pair1 #ax.grid(linestyle="--",linewidth = 0.5,color = ".25",zorder = 0)#only one #plt.show()

关于主刻度线位置的设置,“ax.xaxis.set_major_locator(MultipleLocator(1.0))”会在x轴的1倍处分别设置主刻度线,其中MultipleLocator(1.0)就是设置主刻度线的显示位置。

次要刻度线的显示位置,通过”ax.xaxis.set_minor_locator(AutoMinorLocator(4))”设置次要刻度线的显示位置,其中AutoMinorLocator(4)表示将每一份主刻度线区间等分4份。

设置好刻度线的显示位置后要设置次要刻度线显示位置的精度,这可以通过set_minor_formatter()完成,其中FuncFormatter()是用来控制位置精度的。

刻度样式的设置是通过tick_params()完成的。

主刻度线设置方法的执行语句为“ax.tick_params("y",which="major",length=15,width = 2.0,colors = "r")”。参数意义如下:

which:主刻度样式length:主刻度长度width:主刻度宽度colors:主刻度线和主刻度标签的颜色

次刻度线设置方法的执行语句为“ax.tick_params(which="minor",length=15,width = 2.0,colors = "r")”。参数意义如下:

which:次要刻度样式length:次要刻度长度width:次要刻度宽度labelsize:次要刻度标签的大小labelcolor:次要刻度标签的颜色ax方法和plt方法

也可以通过模块pyplot的函数设置刻度样式——plt.tick_params()。ax.tick_params()和plt.tick_params()的区别在于,前者是matplotlib的面向对象的操作方法,后者是调用模块pyplot的API的操作方法。这是两种不同思想的操作模式,虽然使用pyplot方便,但是要想使图表有更多的调整和定制化展现,还是应该使用matplotlib的面向对象的操作方法。通过面向对象的操作方法,我们能做更多定制:

import matplotlib.pyplot as plt import numpy as np #设置刻度线向外还是向内 plt.rcParams['xtick.direction'] = 'in' plt.rcParams['ytick.direction'] = 'in' fig = plt.figure(facecolor = (1.0,1.0,0.9412)) ax = fig.add_axes([0.1,0.4,0.5,0.5]) for ticklabel in ax.xaxis.get_ticklabels(): ticklabel.set_color("slateblue") ticklabel.set_fontsize(14) ticklabel.set_rotation(30) for tickline in ax.yaxis.get_ticklines(): tickline.set_color("lightgreen") tickline.set_markersize(20) tickline.set_markeredgewidth(2) #plt.show()

我们首先生成Figure实例fig,然后向画布添加坐标轴生成实例ax,add_axes()参数是一个坐标位置和大小的四元列表。通过ax.xaxis获得x轴实例,调用实例方法get_ticklabels()获得Text实例列表,使用for循环对实例元素Text进行不同属性的属性值设置。对y轴也同理。

注解

注解annotate相对应的面向对象的实例方法为Axes.annotate()。注解分为对细节做出标志的有指示注解对整体做出说明的无指示注解。有指示注解是通过箭头指示的方法对绘图区域中的内容进行解释的标注方法;无指示注解是丹村使用文本进行内容解释或是说明的标注方法。

注解添加方法

有指示注解的添加通过annotate()实现;无指示注解的添加通过text()实现。

import numpy as np import matplotlib.pyplot as plt x = np.linspace(0.5,3.5,100) y =np.sin(x) fig = plt.figure(figsize=(8,8)) ax = fig.add_subplot(111) ax.plot(x,y,c = "b",ls = "--",lw = 2) ax.annotate("maximum",xy = (np.pi/2,1.0),xycoords = "data", xytext = ((np.pi/2)+0.15,0.8),textcoords="data", weight = "bold",color = "r", arrowprops=dict(arrowstyle = "->", connectionstyle = "arc3", color = "r")) ax.text(2.8,0.4,"$y = \sin(x)$",fontsize = 20,color = "b", bbox = dict(facecolor = "y",alpha = 0.5)) plt.show()

通过调用“ax.annotate(s,x,y,xycoords,xytext,textcoords,weight,color,arrowprops)”语句可以实现绘制有指示注解的目标。参数定义如下:

s:注解的内容xy:需要进行解释的位置,即被解释内容的位置xycoords:xy的坐标系统,参数值data表示与折线图使用相同的坐标系统xytext:注释内容所在的位置,如果把注释内容想象成一个矩形,xytext标记的是左上角顶点的位置textcoords:xytext的坐标系统weight:注解内容的显示风格color:注解内容的颜色arrowprops:指示箭头的属性,包括箭头风格、颜色等

通过ax.text()添加无指示注解,参数说明如下:

x,y:注解的横纵坐标,如果把注释内容想象成一个矩形,x,y标记的是左上角顶点的位置s:注解的内容圆角线框

我们也可以改变文本框的样式:

import numpy as np import matplotlib.pyplot as plt x = np.linspace(0.0,10,40) y =np.random.randn(40) plt.plot(x,y,ls = "-",lw = 2, marker = "o",ms = 20, mfc = "orange", alpha = 0.6) plt.grid(ls = ":",color = "gray",alpha = 0.5) plt.text(6,0,"Matplotlib",size = 30,rotation=30., bbox = dict(boxstyle="round", ec = "#8968CD", fc = "#FFE1FF")) plt.show()

展示样式通过Rectangle属性字典bbox实现,使用“ boxstyle = “round” ”实现圆角线框,若为“square”,则为直角线框

图片添加水印

使用alpha可以实现水印的效果:

import numpy as np import matplotlib.pyplot as plt x = np.linspace(0.0,10,40) y =np.random.randn(40) plt.plot(x,y,ls = "-",lw = 2, marker = "o",ms = 20, mfc = "orange", alpha = 0.6) plt.grid(ls = ":",color = "gray",alpha = 0.5) plt.text(0.5,1,"Matplotlib",fontsize = 30,color = "gray", alpha = 0.5) plt.show()圆角线框的有弧度指示的注解

我们还可以让指示箭头出现转角:

import numpy as np import matplotlib.pyplot as plt x = np.linspace(0,10,2000) y =np.sin(x)*np.cos(x) fig = plt.figure() ax = fig.add_subplot(111) ax.plot(x,y,ls = "-",lw = 2) bbox = dict(boxstyle = "round",fc = "#7EC0EE",ec = "#9B30FF") arrowprops = dict(arrowstyle = "-|>", connectionstyle = "angle,angleA = 0,angleB = 90,rad = 10", color = "r") ax.annotate("single point", (5,np.sin(5)*np.cos(5)), xytext = (2,np.sin(2)*np.cos(2)), fontsize = 12,color = "r", bbox = bbox,arrowprops=arrowprops) ax.grid(ls = ":",color = "gray",alpha = 0.6) plt.show()

有弧度指示的注解主要是通过Axes.annotate()的参数arrowprops的键值对"angle,angleA = 0,angleB = 90,rad = 10"实现,圆角依然是通过boxstyle = "round"完成。

桑基图

有指示注解也可以作为一种图形——桑基图。桑基图是一种特定类型的流量图,在流量图中,指示箭头的宽度与流量的大小成比例。

import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl from matplotlib.sankey import Sankey mpl.rcParams["font.sans-serif"] = ["FangSong"] mpl.rcParams["axes.unicode_minus"] = False flows = [0.2,0.1,0.4,0.3,-0.6,-0.05,-0.15,-0.2] labels = ["","","","","family","trip","education","sport"] orientations = [1,1,0,-1,1,-1,1,0] sankey = Sankey() sankey.add(flows = flows, labels = labels, orientations = orientations, color = "c", fc = "lightgreen", patchlabel = "Life Cost", alpha = 0.7) diagrams = sankey.finish() diagrams[0].texts[4].set_color("r") diagrams[0].texts[4].set_weight("bold") diagrams[0].text.set_fontsize(20) diagrams[0].text.set_fontweight("bold") plt.title("日常生活中成本开支的流量图") plt.show()

orientations中的-1,0,1分别代表流量的显示位置在下方,水平和上方。

实现标题和坐标轴标签的投影效果标题和坐标轴标签投影效果的操作方法

要使标题和坐标轴标签实现投影效果,需要引入一个新类patheffects(路径效果)。

import numpy as np import matplotlib.pyplot as plt import matplotlib.patheffects as pes x = np.linspace(0.5,3.5,100) y = np.sin(x) fontsize = 23 plt.plot(x,y,ls = "--",lw = 2) title = "$y = \sin({x})$" xaxis_label = "$x\_axis$" yaxis_label = "$y\_axis$" title_text_obj = plt.title(title,fontsize = fontsize,va = "bottom") xaxis_label_text_obj = plt.xlabel(xaxis_label,fontsize = fontsize-3, alpha = 1.0) yaxis_label_text_obj = plt.ylabel(yaxis_label,fontsize = fontsize-3, alpha = 1.0) #设置阴影 title_text_obj.set_path_effects([pes.withSimplePatchShadow()]) pe = pes.withSimplePatchShadow(offset = (1,-1),shadow_rgbFace="r", alpha = 0.03) xaxis_label_text_obj.set_path_effects([pe]) yaxis_label_text_obj.set_path_effects([pe]) plt.show()

我们首先对标题和坐标轴标签的内容进行添加,将标题和坐标轴的文本内容对象进行保存,放到变量title_text_obj、xaxis_label_text_obj和yaxis_label_text_obj。然后设置文本内容投影,主要通过Artist抽象基类的实例方法Artist.set_path_effects(path_effects)实现,set_path_effects是实例列表,列表中的实例就是调用pes类中的withSimplePatchShadow类。初始化函数withSimplePatchShadow()的参数:

offset:文本内容投影相对文本内容本身的偏离距离shadow_rgbFace:投影的颜色给坐标轴标签加文本框import numpy as np import matplotlib.pyplot as plt x = np.linspace(0.5,3.5,100) y =np.sin(x) fig = plt.figure(figsize=(8,8)) ax = fig.add_subplot(111) box = dict(facecolor = "#6959CD",pad = 2,alpha = 0.4) ax.plot(x,y,c = "b",ls = "--",lw = 2) title = "$y = \sin({x})$" xaxis_label = "$x\_axis$" yaxis_label = "$y\_axis$" ax.set_xlabel(xaxis_label,fontsize = 18,bbox = box) ax.set_ylabel(yaxis_label,fontsize = 18,bbox = box) ax.set_title(title,fontsize = 23,va = "bottom") ax.yaxis.set_label_coords(-0.08,0.5) ax.xaxis.set_label_coords(1.0,0.5) ax.grid(ls = "-",lw = 1,color = "gray",alpha = 0.5) plt.show()

bbox是实现坐标轴标签文本框的关键。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3