Matplotlib 的 Legend 圖例就是爲了幫助咱們展現每一個數據對應的圖像名稱,更好的讓讀者認識到你的數據結構。python
如圖,紅色標註部分就是 Legend 圖例。編程
在以前的一篇文章 Matplotlib 系列之「繪製函數圖像」 中已經細講過 Matplotlib 的繪製過程以及結構分析,但願讀者能先去了解一下。bash
接着上一次的代碼繼續講解 Legend 圖例如何展現,以及有哪些經常使用的特性。數據結構
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-3,3,50)
y1=2*x+1
y2=x**2
plt.figure(num=3,figsize=(8,5))
l1=plt.plot(x,y2)
l2=plt.plot(x,y1,color='red',linewidth=1.0,linestyle='--')
plt.legend(handles=[l1,l2],labels=['up','down'],loc='best')
plt.xlabel('x')
plt.ylabel('y')
plt.xlim((-1,2))
plt.ylim((-2,3))
new_ticks=np.linspace(-1,2,5)
print(new_ticks)
plt.xticks(new_ticks)
plt.yticks([-2,-1.8,-1,1.22,3],
[r'$really\ bad$',r'$bad$',r'$normal$',r'$good$',r'$really\ good$'])
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
plt.show()
複製代碼
上一節中仔細繪製了 Matplotlib 的圖像結構,如今能夠進行回顧一下。ide
Title 爲圖像標題,Axis 爲座標軸, Label 爲座標軸標註,Tick 爲刻度線,Tick Label 爲刻度註釋,Legend 爲圖例。函數
這裏咱們將 Legend 圖例設置成 如上圖中所示,即 up 對應 y = 2x + 1,是一條實線,默認顏色,down 對應 y = x^2^ ,虛線,紅色,最後調用 legend 方法設置一些樣式便可。佈局
# 設置 legend 圖例
l1,=plt.plot(x,y1,label='linear line')
l2,=plt.plot(x,y2,color='red',linewidth=1.0,linestyle='--',label='square line')
plt.legend()
複製代碼
不帶參數調用 legend 會自動獲取圖例句柄及相關標籤,此函數等同於:學習
handles, labels = ax.get_legend_handles_labels()
ax.legend(handles, labels)
複製代碼
爲徹底控制要添加的圖例句柄,一般將適當的句柄直接傳遞給 legend:spa
plt.legend(handles=[l1, l2])
複製代碼
在某些狀況下,咱們須要爲 legend 圖例設置標籤線程
plt.legend(handles=[l1, l2], labels=['up', 'down'])
複製代碼
圖例的位置能夠經過關鍵字參數loc
指定。 bbox_to_anchor
關鍵字可以讓用戶手動控制圖例佈局。 例如,若是你但願軸域圖例位於圖像的右上角而不是軸域的邊角,則只需指定角的位置以及該位置的座標系:
當咱們指定 loc = 'upper right',legend 圖例將在右上角展現:
你還能夠指定 loc 在任何你想要指定的位置:
plt.legend(handles=[l1, l2], labels=['up', 'down'], loc='lower right')
複製代碼
整數,字符串或浮點偶對,默認爲 'upper right'。
Keyword | Description |
---|---|
loc | Location code string, or tuple (see below) |
fontsize | the font size (used only if prop is not specified) |
prop | the font property |
markerscale | the relative size of legend markers vs. original |
markerfirst | If True (default), marker is to left of the label |
numpoints | the number of points in the legend for line |
scatterpoints | he number of points in the legend for scatter plot |
scatteroffsets | a list of yoffsets for scatter symbols in legend |
frameon | If True, draw the legend on a patch (frame) |
shadow | If True, draw a shadow behind legend |
framealpha | Transparency of the frame |
edgecolor | Frame edgecolor |
facecolor | Frame facecolor |
fancybox | If True, draw the frame with a round fancybox |
ncol | number of columns |
borderpad | the fractional whitespace inside the legend border |
handlelength | the length of the legend hendles |
handletextpad | The pad between the legend handle and text |
borderaxespad | the pad between the axes and legend border |
columnspacing | the spacing between columns |
title | the legend title |
bbox_to_anchor | the bbox that the legend will be anchored |
bbox_tansform | the transform for the bbox,transAxes if None |
爲了建立圖例條目,將句柄做爲參數提供給適當的HandlerBase
子類。 處理器子類的選擇
有如下規則肯定:
handler_map
關鍵字中的值更新get_legend_handler_map()
。handler_map
中。handler_map
中。mro
中的任何類型是否在新建立的handler_map
中。處於完整性,這個邏輯大多在get_legend_handler()
中實現。
爲了簡單起見,讓咱們選擇matplotlib.legend_handler.HandlerLine2D
,它接受numpoints
參數(出於便利,注意numpoints
是legend()
函數上的一個關鍵字)。 而後咱們能夠將實例的字典做爲關鍵字handler_map
傳給legend
。
import matplotlib.pyplot as plt
from matplotlib.legend_handler import HandlerLine2D
# 設置legend圖例
l1,=plt.plot(x,y1,marker = 'o',label='linear line')
l2,=plt.plot(x,y2,color='red',linewidth=1.0,marker = 'o',label='square line')
plt.legend(handler_map = {l1:HandlerLine2D(numpoints=4)},handles=[l1, l2], labels=['up', 'down'], loc='lower right')
複製代碼
如你所見,up
如今有 4 個標記點,down
有兩個(默認值)。
PS
特別抱歉,本週事情有點多,一直沒有來得及更新。
這周經歷了太多的事情:
一、在上海爲了退房租,和房東大吵,報警,協商,最終仍是我輸了,好無奈。【請廣大上班族在租房子的時候必定要看好合同,別讓奸商有隙可乘】
二、回家看爸媽,房租退了,準備來北京,因此在家呆了兩三天,幫爸媽作點力所能及的事情。
三、踏上北京的征程,今天已是在北京的次日,心情天然是激動而喜悅的,對將來充滿期待。