Matplotlib 系列之「Legend 圖例」

Matplotlib 系列之「Legend 圖例」

Matplotlib 的 Legend 圖例就是為了幫助我們展示每個數據對應的圖像名稱,更好的讓讀者認識到你的數據結構。

如圖,紅色標註部分就是 Legend 圖例。

在之前的一篇文章 Matplotlib 系列之「繪製函數圖像」 中已經細講過 Matplotlib 的繪製過程以及結構分析,希望讀者能先去了解一下。

接著上一次的代碼繼續講解 Legend 圖例如何展示,以及有哪些常用的特性。

import matplotlib.pyplot as pltimport numpy as npx=np.linspace(-3,3,50)y1=2*x+1y2=x**2plt.figure(num=3,figsize=(8,5))l1=plt.plot(x,y2)l2=plt.plot(x,y1,color=red,linewidth_=1.0,linestylex=--)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 的圖像結構,現在可以進行回顧一下。

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,linestylex=--,label=square line)plt.legend()

不帶參數調用 legend 會自動獲取圖例句柄及相關標籤,此函數等同於:

handles, labels = ax.get_legend_handles_labels()ax.legend(handles, labels)

為完全控制要添加的圖例句柄,通常將適當的句柄直接傳遞給 legend:

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 常見參數速查表

KeywordDescriptionlocLocation code string, or tuple (see below)fontsizethe font size (used only if prop is not specified)propthe font propertymarkerscalethe relative size of legend markers vs. originalmarkerfirstIf True (default), marker is to left of the labelnumpointsthe number of points in the legend for linescatterpointshe number of points in the legend for scatter plotscatteroffsetsa list of yoffsets for scatter symbols in legendframeonIf True, draw the legend on a patch (frame)shadowIf True, draw a shadow behind legendframealphaTransparency of the frameedgecolorFrame edgecolorfacecolorFrame facecolorfancyboxIf True, draw the frame with a round fancyboxncolnumber of columnsborderpadthe fractional whitespace inside the legend borderhandlelengththe length of the legend hendleshandletextpadThe pad between the legend handle and textborderaxespadthe pad between the axes and legend bordercolumnspacingthe spacing between columnstitlethe legend titlebbox_to_anchorthe bbox that the legend will be anchoredbbox_tansformthe 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 pltfrom 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

編程界的半壁江山

好書推薦

程序員的數學

豆瓣簡介

如果數學不好,是否可以成為一名程序員呢?答案是肯定的。 本書最適合:數學糟糕但又想學習編程的你。

沒有晦澀的公式,只有好玩的數學題。

幫你掌握編程所需的「數學思維」。

編程的基礎是計算機科學,而計算機科學的基礎是數學。因此,學習數學有助於鞏固編程的基礎,寫出更健壯的程序。

本書面向程序員介紹了編程中常用的數學知識,藉以培養初級程序員的數學思維。讀者無需精通編程,也無需精通數學,只需具備四則運算和乘方等基礎知識,就可以閱讀本書。

書中講 解了二進位計數法、邏輯、餘數、排列組合、遞歸、指數爆炸、不可解問題等許多與編程密切相關的數學方法,分析了哥尼斯堡七橋問題、少年高斯求和方法、漢諾塔、斐波那契數列等經典問題和演算法。引導讀者深入理解編程中的數學方法和思路。

本書還對程序員和計算機的分工進行了有益的探討。讀完此書,你會對以程序為媒介的人機合作有更深刻的理解。

學習之道

豆瓣簡介

讀完一本書,卻不記得講什麼?

美劇看了一籮筐,英語還是沒長進?

公眾號、指導書、牛人帖,一個都沒落,卻還是沒有形成自己的學習體系?

這些都是典型的低質量學習癥狀。 不了解學習的原理,就是在無效重複;缺乏有效的學習方法,就是在消耗天賦。

本書從腦科學和心理學的最新研究出發,跨學科解讀學習的原理,提供最全面的學習方法和思維模式: 大腦如何處理圖形、文字、數字等信息,不同類型的學習匹配哪種信息通路 學藝術、學語言、學音樂、學數理??

各種事物的學習原理有何差異 對於你而言,為什麼 A 方法比 B 方法效果更好 如果你翻開這本書,我相信你對學習是認真的。

想要書籍的請關注【python夢工廠】在後台留言【180811】獲取這兩本書的 PDF 版,希望在學習的道路上,我們能少走彎路,我會盡量推薦自己讀過的好書,希望讀者們能跟著我一起多讀書,讀好書。

PS

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

這周經歷了太多的事情:

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

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

3、踏上北京的征程,今天已經是在北京的第二天,心情自然是激動而喜悅的,對未來充滿期待。

weixin.qq.com/r/DkSHn2D (二維碼自動識別)

推薦閱讀:

python3中如何中文對齊輸出?
自學python之後如果不去公司上班,自己一個人可以通過此技能掙什麼錢?
網頁爬蟲,但總是出現中文亂碼,求大神幫忙解決或看看問題在哪?
python 中的dead()的作用是什麼?
django1.9如何配置static文件夾,從而訪問js,css等靜態文件?

TAG:Python3x | Matplotlib | 閱讀 |