最近畫圖比較多,涉及到一些小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])