精心總結了 10 個 matplotlib 繪圖技巧,短小精悍,威力無窮!
作者 | 劉早起 責編 | 歐陽姝黎
大家好,我是早起。
在使用 Python 進行數據可視化時,相信不論是什麼工具,你都會發現有些操作 / 代碼段會頻繁的用到,這一點在 matplotlib 上尤爲突出。
本文就向大家分享十個我常用的一些小技巧,大多**一行代碼,**短小精悍,威力無窮。
快速且正確的顯示中文
在 matplotlib 中,默認是沒法顯示中文的,原因很簡單,默認使用的字體文件中不含中文。
當你搜索如何設置中文時,會有很多教程,我曾經也詳細的介紹過 3 種方法,但是在有的電腦上折騰很久也搞不定,所以當你浪費了太多時間也沒法解決,或者在一臺陌生的設備上使用,需要快速的讓 matplotlib 顯示中文可以使用下面的代碼。
import matplotlib as mpl
WRYH = mpl.font_manager.FontProperties(
fname='/Users/liuzaoqi/Desktop/可視化圖鑑/font/WeiRuanYaHei-1.ttf')
# 微軟雅黑字體
plt.title('可視化圖鑑', fontproperties=WRYH)
很簡單,既然修改默認的字體搞不定,那麼就準備一箇中文字體的路徑,並在每次需要顯示中文的組件(標題、註釋、圖例等)時,就強制指定使用這個字體。
這個辦法一定可以讓你圖中的中文快速且正確顯示出來,但是如果涉及中文的地方過多,還是需要在以後嘗試一勞永逸的將中文字體添加到默認字體集中。
提高分辨率
如果感覺默認生成的圖形分辨率不夠高,可以嘗試修改 dpi 來提高分辨率,在 matplotlib 中可以一次性通過 plt.rcParams 修改,也可以在創建畫布時爲這一次的繪製修改,例如將分辨率調整至 100
plt.figure(figsize = (7,6),dpi =100)
如果你的設備是配備 Retina 屏幕的 mac,可以在 jupyter notebook 中,使用下面一行代碼有效提高圖像畫質
%config InlineBackend.figure_format = 'retina'
添加數學公式
有時我們在繪圖時需要添加帶有數學符號、公式的文字,如果直接使用默認的方法添加,雖然可以實現,但是不夠美觀,其實在 matplotlib 中也支持輸出數學公式,就像下面的文字註釋一樣
只用在需要出現公式的位置使用 r'你的公式'即可,比如 plt.text(11000,0.45,r'擬合的曲線爲 $f(x) = 1.3x^2-6.54x+0.5$') 注意 $$ 中是 latex 格式的表達方式,如果不熟悉的話需要自行搜索。
當然,也可以使用 plt.rcParams['text.usetex'] = True 設置默認 tex 輸出,異曲同工,此處不多介紹。
一行代碼提高顏值
有時我們會覺得 matplotlib 默認製作出來的圖片太樸素了,不夠高級,其實開發者也內置了幾十種主題讓我們自己選擇,只要使用 plt.style.use('主題名') 指定主題即可,具體的支持主題我也整理出來的在《一行代碼提高顏值,給你的 matplotlib 換個樣式!》這篇文章中。
例如使用 R 語言中經典的 ggplot 主題
plt.style.use('ggplot')
另外一種提高圖形顏值的代碼是借用 seaborn 調色板修改配色,也是一行代碼,通過 sns.set_palette(xxxx) 就能直接調整全局配色方案,下面是我比較喜歡的一種配色
import seaborn as sns
sns.set_palette("pastel", 8)
調整圖例位置
雖然 matplotlib 在生成圖例時,默認會選擇一個最合適的位置,但是有時依舊不能讓人滿意。
相信你知道我們可以使用 loc = xxxx 自己設置圖例位置,但是對於 xxxx 每次都要查,看文字說明左上右下不如一張圖來的快,下面是我們可以選擇的 9 個位置,可以根據自己的需要進行選擇。
獲得當前繪圖區域
在原理篇文章中,我曾經說到如果想要獲得更精細的調整,就需要使用 ax.xxxx 進行調整,但有時我們開始沒有使用 fig,ax=plt.subplots(figsize = (6,4),dpi=100) 來定義 ax,在需要使用時重新開始並定義是不推薦的,這時可以使用
ax = plt.gca()
獲得當前 Figure 中的 Axes,並繼續正常使用 ax.xxxx 調整
隱藏座標軸
對於有些圖形我們希望通過隱藏座標軸來顯得更加美觀,這時可以 ax.spines 獲取對應位置的的 Spine 對象,之後便可以任意修改是否顯示與顯示顏色,比如讓右邊和上面的線消失或者修改顏色
ax.spines['right'].set_color('None')
ax.spines['top'].set_color('None')
ax.spines['right'].set_color('deeppink')
ax.spines['top'].set_color('blue')
ax.spines['bottom'].set_color('green')
ax.spines['left'].set_color('red')
指定座標軸刻度
如果對於默認生成的座標軸刻度不滿意,我們可以使用 plt.yticks([]) 來自定義刻度,注意需要傳入一個你想要的刻度 list,並且長度需要和刻度對應,例如下方代碼
label = ['2月7日','3月25日','5月13日','7月2日','8月21日','10月10日','11月29日','12月31日']
plt.yticks(range(0,400,50), labels=label,rotation = 40,color = 'black')
當然如果 label 是空的話,可以結合上一個技巧把對應的座標軸幹掉,徹底消失
plt.yticks([])
添加自定義圖片
有時我們希望在對數據可視化後添加一些圖片來豐富元素,雖然可以使用 ps 添加,但其實 matplotlib 也可以獨立完成,總共分兩步:打開圖片——添加圖片
首先導入相關的包並根據圖片路徑導入
from matplotlib.offsetbox import (OffsetImage,AnnotationBbox)
import matplotlib.image as mpimg
arr_img = mpimg.imread('你的圖片位置')
接着就可以根據座標將圖片添加到指定位置,詳細的設置可以參考官方文檔,下面的代碼可以拿走就用,根據效果調整座標即可
imagebox = OffsetImage(arr_img, zoom=0.2)
ab = AnnotationBbox(imagebox, [0.15,0.5],
xybox=(170., -50.),
xycoords='data',
boxcoords="offset points",
pad=0.5
)
ax.add_artist(ab)
添加表格
有時只用圖片很難傳遞更多的信息,幸運的是,在 matplotlib 中也可以使用 plt.table 來爲圖片添加一張與之對應的表格,只需要將你的數據按照指定格式傳入即可。
下面是我在官方文檔示例的基礎上,添加漸變效果的表格
data = [[ 66386, 174296, 75131, 577908, 32015],
[ 58230, 381139, 78045, 99308, 160454],
[ 89135, 80552, 152558, 497981, 603535],
[ 78415, 81858, 150656, 193263, 69638],
[139361, 331509, 343164, 781380, 52269]]
columns = ('Freeze', 'Wind', 'Flood', 'Quake', 'Hail')
rows = ['%d year' % x for x in (100, 50, 20, 10, 5)]
values = np.arange(0, 2500, 500)
value_increment = 1000
colors = plt.cm.BuPu(np.linspace(0, 0.5, len(rows)))
n_rows = len(data)
index = np.arange(len(columns)) + 0.3
bar_width = 0.4
plt.figure(figsize = (8,5),dpi =100)
y_offset = np.zeros(len(columns))
cell_text = []
for row in range(n_rows):
plt.bar(index, data[row], bar_width, bottom=y_offset, color=colors[row])
y_offset = y_offset + data[row]
cell_text.append(['%1.1f' % (x / 1000.0) for x in y_offset])
colors = colors[::-1]
cell_text.reverse()
the_table = plt.table(cellText=cell_text,
rowLabels=rows,
rowColours=colors,
colLabels=columns,
loc='bottom'
,cellColours=plt.cm.Blues(x))
plt.subplots_adjust(left=0.2, bottom=0.2)
plt.ylabel("Loss in ${0}'s".format(value_increment))
plt.yticks(values * value_increment, ['%d' % val for val in values])
plt.xticks([])
plt.title('Loss by Disaster')
plt.show()
以上就是本文和大家總結的 10 個 matplotlib 小技巧,在未來的文章中我會繼續分享相關知識,也希望大家可以在使用一些數據可視化工具時可以不斷總結,不斷進步。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/oAws2SXh45mLHUgcp9oTTQ