注:本文使用jupyter编写代码!!!
#先导入包
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline##jupyter可以用,这样就不用plt.show(),但是与使用plt.show()不冲突
#1.了解mpl画图的基本结构和流程。(建议初学用ax.xxx方法绘图,按流程来!!!不然可能很混乱,请区分plt.xxx与ax.xxx的区别,方便对图做修改)
##1)先建一个画板:figure。
#figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None, frameon=True)。
#num:表示第几个画板或画板名称;
#figsize:画板大小
#dpi:dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80
#facecolor:背景颜色
#edgecolor:边框颜色
#frameon:是否显示边框
fig=plt.figure(num="画图1",figsize=(8,5),dpi=60,facecolor="blue",edgecolor="blue",frameon=True)#(8,5)即长8英寸,宽5英寸
##2)再“贴”画纸ax
#plt.subplot(nrows, ncols, index, **kwargs)
#nrows, ncols, index:对画板分成行×列个区域,索引为第几个区域
#projection : {None, ‘aitoff’, ‘hammer’, ‘lambert’, ‘mollweide’, ‘polar’, ‘rectilinear’, str}, optional:子图类型
#polar : boolean, optional:
ax1=plt.subplot(221)#画纸ax1,而且“贴”在画板的左上角(221的意思是:将画板分为2×2的4个区域,选第一个区域贴画纸)
ax2=plt.subplot(222)#画纸ax2
ax3=plt.subplot(223)#画纸ax3
#ax4=plt.subplot(224)#画纸ax4
fig2,ax=plt.subplots(3,2,figsize=(8,5))#plt.subplots()一下子可以创建所有子图;而plt.subplot()只能一个一个创建
#fig2=plt.figure(num=2,figsize=(10,4),dpi=80,facecolor="red")#facecolor="red"不起作用咋回事???
fig2=plt.figure(num=2,figsize=(10,4),dpi=80)
ax2=plt.subplot(323,projection="aitoff")
plt.show()
##3)修改图的参数:坐标轴,主次刻度,取值范围等(以y=x**2图为例)
x=np.linspace(-2,2,20)#生成从-2到2的20个等间距点
y=x**2
#建画板
fig=plt.figure(num=3,figsize=(10,8))
#贴画纸
ax2=plt.subplot(222)
ax2.plot(x,y,linewidth=3,color="red",linestyle="dashed")
#3.1)给坐标轴命名并对字体进行设置
##ax2.ylabel(ylabel=“I am Y aixs”)#AttributeError: ‘AxesSubplot’ object has no attribute ‘ylabel’
plt.ylabel("ues plt.xxx--ylabel",color="blue",fontsize=16,fontfamily="Times New Roman",rotation=85,fontstyle="oblique")
#这个可以,这就是plt.xxx与ax.xxx的其中一个区别(no.1)!!!很多设置函数不一样
##一般用字典形式把字体参数都设置好
#并不是所有的字体都有italic属性,这时候就得用到oblique属性了。
# font-style:oblique是单纯的使文字倾斜,不管该字体有没有italic属性。’’’
# #改变weight 和style
# styles=[‘normal’,‘italic’,‘oblique’]
# weights=[‘light’,‘normal’,‘medium’,‘semibold’,‘bold’,‘heavy’,‘black’]
font={'family':'serif',
'style':'italic',
'weight':'normal',
'color':'red',
'size':16
}
ax2.set_xlabel('I am X Label',font)
#3.2)主次刻度
#导入需要的包
from pylab import *
from matplotlib.ticker import MultipleLocator, FormatStrFormatter
x=np.linspace(-20,20,20)
y=x**2
fig=plt.figure(figsize=(10,6))
ax=plt.subplot(221)
ax.plot(x,y)
xmajorLocator=MultipleLocator(10) #将x主刻度标签设置为10的倍数
xminorLocator= MultipleLocator(4) #将x轴次刻度标签设置为4的倍数
xmajorFormatter = FormatStrFormatter('%5.1f') #设置x轴标签文本的格式
#ymajorLocator=MultipleLocator(100)
ax.xaxis.set_major_locator(xmajorLocator)#上面只是设置,这一句才能呈现出想要的主刻度
ax.xaxis.set_minor_locator(xminorLocator)#呈现出次刻度
#ax.xaxis.set_major_formatter(xmajorFormatter)
ax.tick_params(axis="x",direction="out")#为什么主刻度随着direction内外变,但是次刻度总是in呢?(oh,i see!!!参数which默认值就是"major",这是原因)
##Axes.tick_params(axis=‘both’, **kwargs)
#axis : {‘x’, ‘y’, ‘both’}:参数axis的值为’x’、‘y’、‘both’,分别代表设置X轴、Y轴以及同时设置,默认值为’both’。
#参数which的值为 ‘major’、‘minor’、‘both’,分别代表设置主刻度线、副刻度线以及同时设置,默认值为’major’
#参数direction的值为’in’、‘out’、‘inout’,分别代表刻度线显示在绘图区内侧、外侧以及同时显示
#length和width:参数length和width分别用于设置刻度线的长度和宽度
#参数pad用于设置刻度线与标签间的距离
#参数color、labelcolor、colors分别用于设置刻度线的颜色、刻度线标签的颜色以及同时设置刻度线及标签颜色
#参数labelsize用于设置刻度线标签的字体大小
#参数bottom, top, left, right的值为布尔值,分别代表设置绘图区四个边框线上的的刻度线是否显示
#参数labelbottom, labeltop, labelleft, labelright的值为布尔值,分别代表设置绘图区四个边框线上的刻度线标签是否显示
##参考于优快云博文:https://blog.youkuaiyun.com/helunqu2017/article/details/78736554?
#------------------------------------------------------------------------------------------
#ax.tick_params(axis=“y”,direction=“in”)
##plt.rcParams[]
#pylot使用rc配置文件来自定义图形的各种默认属性,称之为rc配置或rc参数。通过rc参数可以修改默认的属性,
#包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。
#rc参数存储在字典变量中,通过字典的方式进行访问
#-参考博文:https://www.cnblogs.com/pacino12134/p/9776882.html
plt.rcParams['ytick.direction'] = 'inout'#这是plt.xxx与ax.xxx的第二个区别处(no.2)##可以考虑用字典传入所有想要设置的参数
#3.3)取值范围
x=np.linspace(-7,13,20)
y=2*x+0.6
plt.plot(x,y)
plt.xlim(-10,10)#x轴取值范围[-10,10]。###.xlim方法
plt.ylim(-5,18)#y轴取值范围[-5,18]
#-------------------------------------------------------------------------------
ax = plt.gca()#在没有事先定义ax的情况下从figure上获得ax。
当前的图表和子图可以使用plt.gcf()和plt.gca()获得,分别表示Get Current Figure和Get Current Axes。
在pyplot模块中,许多函数都是对当前的Figure或Axes对象进行处理,
比如说:plt.plot()实际上会通过plt.gca()获得当前的Axes对象ax,然后再调用ax.plot()方法实现真正的绘图。
#####这个很好的说明了plt.xxx与ax.xxx的关系,plt.xxx本质上其实是一个“黑盒子”,这个盒子里面会调用ax.xxx。但是这个盒子有自己的一些操作方法而已。
ax.set_xlim(-15,9)###set_xlim方法
#3.4)改变坐标轴位置
x=np.linspace(-7,13,20)
y=2*x+0.6
plt.plot(x,y)
ax = plt.gca()
ax.set_xlabel("I am x Label")
ax.spines["right"].set_color("none")#右边坐标轴不可见
ax.spines["top"].set_color("none")
###ax.tick_params(top=True)
ax.xaxis.set_ticks_position("bottom")# 设置坐标轴上的数字显示的位置,top:显示在顶部 bottom:显示在底部,默认是none
ax.yaxis.set_ticks_position("left")
ax.spines["bottom"].set_position(("data",0))#"data"是x轴数据,移到y=0处
ax.spines["left"].set_position(("data",0))
ax.set_xticks([-5, 5])
ax.set_yticks([-10, 20])
方法3:坐标刻度定位器 axis :ax.x[y]axis.set_major[minor]_locator(locator)
与(plt.xticks , plt.yticks)和 (ax.set_xticks和ax.set_yticks)一样功能
ax.yaxis.set_major_locator(plt.MaxNLocator(nbins=5, steps=[1, 3, 5, 7, 9])) # 面元划分 4段数据
ax.yaxis.set_minor_locator(plt.MultipleLocator(0.5)) # 次刻度间隔
####原文链接:https://blog.youkuaiyun.com/weixin_40040404/article/details/81185564
#3.5)注释
#1. 指向型注释plt.annotate()
# s:str, 注释信息内容
# xy:(float,float), 箭头点所在的坐标位置
# xytext:(float,float), 注释内容的坐标位置
# weight: str or int, 设置字体线型,其中字符串从小到大可选项有{‘ultralight’, ‘light’, ‘normal’, ‘regular’,
#‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, ‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’}
# color: str or tuple, 设置字体颜色 ,单个字符候选项{'b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'},也可以'black','red'等,
#tuple时用[0,1]之间的浮点型数据,RGB或者RGBA, 如: (0.1, 0.2, 0.5)、(0.1, 0.2, 0.5, 0.3)等
# arrowprops:dict,设置指向箭头的参数,字典中key值有①arrowstyle:设置箭头的样式,其value候选项如'->','|-|','-|>',
#也可以用字符串'simple','fancy'等,详情见顶部的官方项目地址链接。
# ②connectionstyle:设置箭头的形状,为直线或者曲线,候选项有'arc3','arc','angle','angle3',可以防止箭头被曲线内容遮挡
# ③color:设置箭头颜色,见前面的color参数。
# bbox:dict,为注释文本添加边框,其key有
#①boxstyle,其格式类似'round,pad=0.5',其可选项如下:
#②facecolor(可简写为fc)设置背景颜色
# ③ edgecolor(可简写为ec)设置边框线条颜色
# ④lineweight(可简写为lw)设置边框线型粗细
# ⑤alpha设置透明度,[0,1]之间的小数,0代表完全透明,即类似③颜色设置无效。
# 链接:https://www.jianshu.com/p/0f56caf4f859