天文学论文绘图注意事项

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显示一条黑色的虚线

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值