Toccata in Nowhere.

Plt的快速绘图格式化工具库

2020.02.28

快速绘图格式化工具库dsPltTool

引入

from dsPltTool import *

mst()多格式快速设定

参数

参数 说明 默认 类型
ax subplot的子ax plt.gca() 可选参数
label x/y轴label,[xlabel, ylabel] 可选参数
xlabel x轴label,用作单轴设定 可选参数
ylabel y轴label,用作单轴设定 可选参数
title 图标题 可选参数
xlim x轴坐标范围 [xmin, xmax] 自动 可选参数
ylim y轴坐标范围 [ymin, ymax] 自动 可选参数
style 字体风格,"Times"/"Arial" "Times" 可选参数
fontsize label字体大小 10 可选参数
legend 是否有图例,True/False False 可选参数
rotate x坐标文字旋转45度,True/False False 可选参数
axis_width 坐标轴线宽度 1 可选参数
half_axis 是否显示一半坐标,True/False False 可选参数

Tips: xlabel/ylabel设置优先级高于label

使用例

单图

设定坐标名称与图标题

mst(label=["x","y"], title="title")

subplot

多参数设定

label = ['Axis xx', 'Axis yy']
mst(axes[1], label=label, title='Figure B', legend=True, style="other", xlim = [0,100000], fontsize=10, axis_width=0.5, half_axis=True,rotate=True)

注意事项

第一次使用 Times New Roman 字体时,如使用Mac系统可能无法映射字体。可复制以下代码到Python环境中运行一次即可。

import matplotlib
del matplotlib.font_manager.weight_dict['roman']
matplotlib.font_manager._rebuild()

使用legend时,需要在绘制plot时给定label指定名称,否则将显示内存地址。

plt.plot(x, y , label='Line Name')

x_bf()/y_bf() 主副坐标/自定义坐标间隔

参数

参数 说明 类型 默认
major 主坐标步长 必要参数 -
num 主坐标之间副坐标数 可选参数 0
dot 主坐标保留小数点个数 可选参数 1
ax subplot的子ax 可选参数 plt.gca()

使用例

单图

设定y轴10为间隔的主坐标,保留两位小数

y_bf(10,dot=2)

subplot

设定x轴步长为10000主坐标,包含5个副坐标

x_bf(ax=axes[1],major= 10000, num=5, dot=0)

reverse_direction() 翻转坐标指示

构建MATLAB风格的坐标轴 必须在所有的plt操作之前使用

参数

参数 说明 类型 默认
axis 需要翻转的坐标轴 可选参数 "xy"

使用例

翻转x轴坐标指示:

reverse_direction("x")

同时翻转x轴、y轴:

reverse_direction()

global_serif() 设置全局使用Times字体

必须在所有的plt操作之前使用 使colorbar也可使用Times New Roman字体

参数

使用例

设置全局使用Times字体:

global_serif()

附:代码

文件名:dsPltTool.py

import matplotlib.pyplot as plt
import matplotlib
import numpy as np
from matplotlib.ticker import MultipleLocator, FormatStrFormatter

'''
#### IMPORTANT #####
For using font of Times new roman 
COPY these two lines code below 
and MOVE to main program file
for the FIRST TIME runing

del matplotlib.font_manager.weight_dict['roman']
matplotlib.font_manager._rebuild()

'''

# multi_set_tool
def mst(ax=[], label=[], xlabel="", ylabel="",title=[], xlim=[], ylim=[], style="Times", fontsize=10, width_line=1 ,legend=False, rotate=False, axis_width=1, half_axis=False):
	
	if not ax:
		ax = plt.gca()
		
	if style == "Times":
		font1 = {'family' : 'Times New Roman', 'size': fontsize,}
		font2 = {'family' : 'Times New Roman', 'size': fontsize*1.2,}
		font3 = {'family' : 'Times New Roman', 'size': fontsize*1.4,}
		plt.tick_params(labelsize=fontsize)
		labels = ax.get_xticklabels() + ax.get_yticklabels()
		[label.set_fontname('Times New Roman') for label in labels]
		
	elif style == "Arial":
		font1 = {'family' : 'Arial', 'size': fontsize,}
		font2 = {'family' : 'Arial', 'size': fontsize*1.2,}
		font3 = {'family' : 'Arial', 'size': fontsize*1.4,}
		plt.tick_params(labelsize=fontsize)
		labels = ax.get_xticklabels() + ax.get_yticklabels()
		[label.set_fontname('Arial') for label in labels]
		
	else:
		font1 = {'size': fontsize,}
		font2 = {'size': fontsize*1.2,}
		font3 = {'size': fontsize*1.4,}
		plt.tick_params(labelsize=fontsize)
		
	if half_axis:
		for axis in ['bottom','left']:
			ax.spines[axis].set_linewidth(axis_width)
		for axis in ['top', 'right']:
			ax.spines[axis].set_linewidth(0)
	else:
		for axis in ['top','bottom','left','right']:
			ax.spines[axis].set_linewidth(axis_width)
	
	if title:
		ax.set_title(title,font2)

	if len(label) == 2:
		ax.set_xlabel(label[0],font2)
		ax.set_ylabel(label[1],font2)
	
	if xlabel:
		ax.set_xlabel(xlabel, font2)
	
	if ylabel:
		ax.set_ylabel(ylabel, font2)
	
	if legend:
		legend = ax.legend(prop=font1)
			
	if len(xlim) == 2:
		ax.set_xlim(xlim)

	if rotate:
		ax.set_xticklabels(ax.get_xticks(),rotation=45)
	
	if len(ylim) == 2:
		ax.set_ylim(ylim)
		
def x_bf(major, num=0, dot=1, ax=[]):
	if not ax:
		ax = plt.gca()
	
	if num <= 0:
		minor = major
			
	else:
		minor = major / num
			
	format_str = '%1.' + str(dot) + 'f'
	xmajorLocator   = MultipleLocator(major)
	xmajorFormatter = FormatStrFormatter(format_str)
	xminorLocator   = MultipleLocator(minor)
	ax.xaxis.set_major_locator(xmajorLocator)
	ax.xaxis.set_minor_locator(xminorLocator)
	ax.xaxis.set_major_formatter(xmajorFormatter)
	
	
def y_bf(major, num=0, dot=1, ax=[]):
	if not ax:
		ax = plt.gca()
	
	if num <= 0:
		minor = major
		
	else:
		minor = major / num
		
	format_str = '%1.' + str(dot) + 'f'
	ymajorLocator   = MultipleLocator(major)
	ymajorFormatter = FormatStrFormatter(format_str)
	yminorLocator   = MultipleLocator(minor)
	ax.yaxis.set_major_locator(ymajorLocator)
	ax.yaxis.set_minor_locator(yminorLocator)
	ax.yaxis.set_major_formatter(ymajorFormatter)
	
def reverse_direction(axis="xy"):
	if axis == "x":
		plt.rcParams['xtick.direction'] = 'in'
	elif axis =="y":
		plt.rcParams['ytick.direction'] = 'in'
	else:
		plt.rcParams['xtick.direction'] = 'in'
		plt.rcParams['ytick.direction'] = 'in'
		
def global_serif():
	plt.rcParams['font.family'] = 'Times New Roman'