最近画图比较多,涉及到一些小tricks,包括
- 设置子图间距
- 设置等值线
- 保存图片时紧凑
- 句柄设置横纵坐标和刻度
- 显示中文
以下面的一个代码示例来贯通这些技巧:
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
###使得中文字体不乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
#matplotlib.rcParams['font.family']='sans-serif'
plt.rcParams['axes.unicode_minus']=False
#构建一行两列的多子图, 设置子图之间的距离
fig1, axes = plt.subplots(1,2,figsize = (16,7))
fig1.tight_layout(pad = 2.7) #pad参数设置子图之间的间隔
#构建数据
x = np.arange(-5,6)
y = np.arange(-5,6)
xx ,yy = np.meshgrid(x,y)
#已知 z1范围为[0,50],为同心圆;z2范围为[-25,50]
z1 = xx**2 + yy**2
z2 = xx**2 - yy**2
#设置画出数值 = x 的等值线,
#给出x, 从-50~50,每隔2画一条等值线
#levels_label为每隔1条等值线,标出该等值线数值
levels = np.arange(-50, 50,2)
levels_label = list(levels[::2]) #必须为列表list
#该color也可以为 和levels 维度一样的数组,表示每条等值线对应一个颜色
#这样就可以设置等值线
color = 'k'
x_ticks = np.arange(0,11)
y_ticks = np.arange(0,11)
x_tickslabel = np.arange(-5,6)
y_tickslabel = np.arange(-5,6)
fontsize = 20
xfontdict = {'fontsize' : fontsize}
yfontdict = {'fontsize' : fontsize}
for ax,z in zip(list(axes),[z1,z2]):
h = ax.contour(z,
levels = levels,
colors = color,
)
#如果不设置levels_label,则默认每条等值线都有标签
if levels_label == None:
ax.clabel(h,
inline = True, #标签位置,在线内
fontsize = 16, #标签字体大小
colors = color, #标签颜色
fmt = '%1.0f')
else:
ax.clabel(h,
levels_label,
inline = True, #
fontsize = 16,
colors = color,
fmt = '%1.0f')
##设置x,y轴的ticks 和 tickslabel
ax.set_xticks(x_ticks)
ax.set_xticklabels(x_tickslabel,fontdict = xfontdict)
ax.set_yticks(y_ticks)
ax.set_yticklabels(y_tickslabel,fontdict = yfontdict)
ax.set_xlabel(r'经距/(°)',fontsize = fontsize)
axes[0].set_ylabel(r'纬距/(°)',fontsize = fontsize)
fig1.savefig('D:/contour.jpg',
dpi = 100, #分辨率
bbox_inches = 'tight', #图型紧凑,不留空白
)
#此时我们换一个levels, -50~-20,每隔4画一条等值线 ~~~~
#lables间距2
levels = list(np.arange(-50,-20,4)) + list(np.arange(-20,20,3)) +list(np.arange(20,50,4))
levels_label = list(levels[::2])