1. 需要让刻度线在上下左右都显示,并且刻度向内,如下图所示
可以通过如下步骤实现:
首先在Python中使用如下命令找到matplotlib配置文件存在的位置
import matplotlib
print(matplotlib.matplotlib_fname())
接着在命令行下使用vim 打开配置文件,找到ticks部分
将xtick.top,ytick.right改为True,xtick.direction,ytick.direction改为in
2. 绘图时要注意绘图时要导出axes
画一个图使用
ax = plt.subplot(111)
多个图就每个subplot都给一个ax,画plot图,scatter图都很简单 ,绘制单个变量的分布往往需要画step图而不是hist图,命令如下
zgrid = np.linspace(12,16,11) #给定一个分bin的框架
hx, xedge = np.histogram(data,bins=zgrid) #hx是每个bin的高度,xedge是x轴每一个节点的坐标,所以xedge比hx长度大1
plt.step(xedge[:-1] ,hx,color='black',where='post')
如果是多个变量的分布画到一张图上,需要使用hist命令,并且调整arfa参数,这个表示的是透明度,越低越透明
画二维直方图(也就是密度图)需要使用
plt.hist2d(x,y,200,cmin=1,cmap='rainbow')
200表示把全图分割为200*200个格子,如果格子里面的点低于cmin的数值,则不会显示这个格子
200这里也可以输入两个数组,这样子就会按照输入的数组把数据分格子,然后画二维直方图
plt.hist2d(x,y,[np.linspace(0,10,100),np.linspace(-5,5,100)],cmin=1,cmap='rainbow')
画图时常用的功能通过如下参数实现:
(1)为每一个图加label:
plt.scatter(x, y, 1,label='1')
plt.scatter(x, y, 1,label='2')
plt.legend(fontsize=20)
legend里面的prop参数可以制定label的字体,一般我们只需要把字体放大,所以我这里只用到了fontsize参数
(2)修改坐标轴字体的大小:
在画图前输入
plt.tick_params(labelsize=30)
(3)给定x,y轴的label,修改x,y轴label的大小:
plt.xlabel('X',size=20)
plt.ylabel('Y',size=20)
(4) 设置x,y上下限
plt.xlim(0,2)
plt.ylim(2,6)
如果输入的第一个数字比第二个大,就会把相应的轴反转,比如
plt.xlim(2,0)
会使得x 轴从2到0,而不是默认的从0到2
(5)设置坐标轴对数显示
plt.xscale('log')
plt.yscale('log')
(6)在图中加文字
plt.text(x=10.5, y=-4, s='dwarfs',fontsize=20)
x,y对应的就是文字在图中的位置,s就是想插入的文字,fontsize是用来修改字体大小的
(7)为颜色图加colorbar
画完图之后加上
cb = plt.colorbar()
因为前面设置了刻度向里,所以这里colorbar显示的会向左而不是常见的向右,所以我们要设置
cb.ax.tick_params(labelsize=20,direction='out',size=6)
labelsize 表示colorbar显示的文字的字体大小,direction表示刻度向外还是向内(也就是向右还是向左),size表示刻度的长度,默认显示的刻度值不一定吻合我们的想法,我们可以使用如下命令来让colorbar显示我们想要显示的刻度
cb.set_ticks([1,10,100,1000,10000])
让colorbar显示文字,比如显示一个[Fe/H]
cb.set_label('[Fe/H]', size=20)
我们可能想要让colorbar不是线性显示而是对数或者其他的方式显示,这可以这样来实现
from matplotlib.colors import FuncNorm
import matplotlib as mpl
def _forward(x):
return np.log10(x)
def _inverse(x):
return 10**x
my_norm = mpl.colors.FuncNorm((_forward, _inverse))
#定义一个你自己想要的colorbar显示方式
然后在画图时候使用
plt.scatter(x,y,1,norm = my_norm, rasterized=True)
当然对数很简单,matplotlib有一个自带的norm种类——colors.LogNorm(),令norm等于他即可,其中rasterized参数是将图片光栅化,也就是模糊处理,如果图片很大的时候(10M以上),需要用到这个命令,要不然图片太大使用LaTeX编译会很费时间而且没必要
(8)让x,y显示我们想要显示的刻度
plt.xticks([5,10,15])
plt.yticks([-40,-20,0,20,40])
(9)多个子图的坐标轴放置
如果画了多个子图,坐标轴放大的情况下,往往会叠到一起,我们在全部子图画完之后,使用如下命令
plt.gcf().set_size_inches(9, 6.8) # 设置画布的大小
plt.tight_layout() #使得label互相不干扰
3. 设置次刻度值
次刻度值也就是第一个图中细小的刻度值,他通过如下命令实现
ax=plt.subplot(111)
plt.tick_params(labelsize=16)
plt.hist2d(R,Z,220,cmin=1,cmap='rainbow', norm = colors.LogNorm(),rasterized=True)
xmajorLocator = MultipleLocator(10) # 将x主刻度标签设置为10的倍数
xminorLocator = MultipleLocator(2) # 将x次刻度标签设置为2的倍数
ymajorLocator = MultipleLocator(20) # 将y轴主刻度标签设置为20的倍数
yminorLocator = MultipleLocator(4) # 将此y轴次刻度标签设置为4的倍数
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_minor_locator(yminorLocator)
注意主刻度值的间隔必须与tick的一样,要不然图片的刻度值会很丑,主次刻度值的间隔一般是5:1
主次刻度值的默认长度也不够长,你往往需要加长他们,同样是修改配置文件,修改配置文件里面的这几个参数即可(同样在ticks部分)
#xtick.major.size: 16 # major tick size in points
#xtick.minor.size: 6 # minor tick size in points
#ytick.major.width: 16 # major tick size in points
#ytick.minor.width: 6 # minor tick size in points
或者在画图时使用
matplotlib.rcParams['xtick.major.size'] = 16
matplotlib.rcParams['ytick.minor.size'] = 6
matplotlib.rcParams['xtick.major.size'] = 16
matplotlib.rcParams['ytick.minor.size'] = 6
来设置当前脚本文件的画图设置
4. 修改坐标轴刻度数字的显示方式
当数字比较大的时候,比如刻度显示10000显然是不合适的,我们应该显示100K,或者数字的小数部分有多有少,我们需要协调他们,使得他们的显示方式一致
from matplotlib.ticker import FuncFormatter
def killions(x, pos):
return '%1.0fK' % (x*1e-3)
my_formatter = FuncFormatter(killions)
画完图后加上
ax.yaxis.set_major_formatter(my_formatter)
'%1.0K'就是以K的形式表现,并且小数部分不显示,这个其实是Python的format显示
5. 残差图需要有一条y=0的虚线
画完图后加一个命令
plt.hlines(0,-2.5,0.7,'black','dashed')
表示在y=0,x从-2.5到0.7显示一条黑色的虚线