Matplotlib 系列之「Legend 圖例」

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 圖例

這裏咱們將 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')
複製代碼

loc 使用參數

整數,字符串或浮點偶對,默認爲 'upper right'。

Legend 常見參數速查表
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參數(出於便利,注意numpointslegend()函數上的一個關鍵字)。 而後咱們能夠將實例的字典做爲關鍵字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有兩個(默認值)。

推薦閱讀

你須要的「 認知與技術 」福利

Python 學習之進程與線程 「 上 」

來北京的日子

這麼多年都白學了,原來是方法沒有用對

貝斯狸的 Python 之旅 -- 深刻切片操做及原理

牆裂推薦 Anaconda | 安利 Python IDE

編程界的半壁江山

PS

特別抱歉,本週事情有點多,一直沒有來得及更新。

這周經歷了太多的事情:

一、在上海爲了退房租,和房東大吵,報警,協商,最終仍是我輸了,好無奈。【請廣大上班族在租房子的時候必定要看好合同,別讓奸商有隙可乘】

二、回家看爸媽,房租退了,準備來北京,因此在家呆了兩三天,幫爸媽作點力所能及的事情。

三、踏上北京的征程,今天已是在北京的次日,心情天然是激動而喜悅的,對將來充滿期待。

相關文章
相關標籤/搜索