Tips of Matplotlib in Python

有关于Python中Matplotlib的一些画图小技巧——在多年实践中收集整理,持续更新

颜色棒(colorbar)相关

imshow设置颜色范围

ax.imshow(data, vmin = vm0, vmax = vm1)

对数颜色轴

ax.imshow(data, norm = matplotlib.colors.LogNorm(vmin=vm0, vmax=vm1))

多子图的画布添加一个公共颜色棒/添加一个colorbar在最右侧

cax = fig.add_axes([0.925, 0.1, 0.025, 0.85])
cb = plt.colorbar(im,cax=cax)

自定义颜色轴需要显示的刻度

(如果是对数坐标,需要第二行代码)

cb = plt.colorbar(im, ticks=[0.05,0.1,0.2,0.3])
cb.set_ticklabels([0.05,0.1,0.2,0.3])

设置颜色图colormap上下限以外的值的颜色,bad/NaN值颜色

用copy不改变该cmap的默认值

import copy
import matplotlib
cmap = copy.copy(matplotlib.cm.Spectral) #拷贝Spectral这个colormap
cmap.set_under('gray',0.7) #值低于下限的颜色,默认为cmap中的最小值
cmap.set_over('gray',0.7)  #值高于上限的颜色
cmap.set_bad('gray',0.7)   #NaN值颜色
plt.imshow(im, cmap=cmap)

画布(fig)布局相关

隐藏空白子图

ax.set_visible(False)

对齐图中x/y/所有轴标签

fig.align_xlabels()
fig.align_labels()

调整画布边缘白色区域

plt.subplots_adjust(left=0.05, bottom=0.1, right=0.9, top=0.9, wspace=0.15)

轴(ax)相关

获得轴的上下限

ax.get_xlim()

x轴反向

plt.gca().invert_xaxis()
ax.invert_xaxis()

对数y轴

ax.set_yscale('log')

关闭、隐藏x轴刻度标签

plt.setp(ax.get_xticklabels(), visible=False)

关闭y轴主/次刻度

plt.setp(ax.get_yticklines(minor=True), visible=False)

图的右侧添加刻度和标签

ax.tick_params(right = True, labelright = True)
# 打开上侧次要刻度
ax.tick_params(top = True, which='minor')

双y轴/创建副y轴的ax

ax2 = ax.twinx()

全局xlabel/总ylabel

fig.supxlabel('x')

设置y刻度/刻度标签的颜色

ax.tick_params(color='C0')
ax.tick_params('y',labelcolor='C0')

未整理

imshow自定义长宽比(像素不固定为正方形/自动拉伸像素)

ax.imshow(data, aspect='auto')

显示坐标网格(只对主刻度显示)

plt.grid(True,ls=':',lw=0.2,zorder=1,color='dimgray', which="major")
# 若只画x轴的网格
ax.xaxis.grid(True)

text文本右侧/上端/中心对齐

plt.text(ha='right', va='top')
plt.text(va='center')

text文本参照ax百分比确定位置,调整行距

plt.text(transform = ax.transAxes, linespacing=1.5)

随机选1/10的点,常用于减少散点数量

ind = np.random.randint(0,len(x),size=round(len(x)/10))

只在最外侧坐标轴显示label / 判断ax是否在边缘的命令

if ax.is_last_row():   ax.set_xlabel('x')
if ax.is_first_col():  ax.set_ylabel('y')

imshow以左下角为原点

plt.imshow(origin='lower')

imshow保存图片时候像素边界模糊/串色的问题,把默认的反锯齿插值设为none

plt.imshow(data, interpolation='none')

设置子图投影法

fig,axes = plt.subplots(1,1, figsize=(10,5), dpi=200, subplot_kw={'projection': 'mollweide'})

设置为默认风格

import matplotlib.style as style
style.use('default')