最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用matplotlib畫圖自定義marker

 更新時間:2023年06月25日 09:06:16   作者:qiu_xingye  
這篇文章主要介紹了使用matplotlib畫圖自定義marker問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

matplotlib畫圖自定義marker

在matplotlib工具箱中可以畫marker的高級作圖函數(shù)一共有兩個,分別為plot和scatter,可以畫出多種marker。

但如果需要繪制一些特殊的marker,則必須通過自的定義marker來實現(xiàn)。

一般有兩種方式可以實現(xiàn):

  • 一是在繪圖中插入特殊marker的icon圖片
  • 二是借助于matplotlib.path中的Path類,自定義marker的Path參數(shù)。

但無論何種方式,實現(xiàn)的marker都要具有一般marker的特點。

marker的特點

  • 固定大小:marker的大小只依賴于markersize關(guān)鍵字定義的數(shù)值,不隨著繪制的圖形的放大或縮小而變化;
  • 可改變方向: matplotlib默認(rèn)支持的某些marker可以通過傳入的參數(shù)調(diào)整marker的方向

基于marker的上述兩個特點,因此不能簡單地通過plot繪制特殊marker的折線或者簡單地進行圖片插入實現(xiàn)。

通過插入圖片實現(xiàn)自定義marker

from matplotlib 
import pyplot as pltimport numpy as np
'圖片插入(普通)'
N = 100
x = np.linspace(0, 10, N)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(plt.imread('icon\\icon-test.png'), extent=(x[0],x[0]+1,y[0],y[0]+1))
ax.plot(x, y)
plt.show()

如上圖所示,基本可以實現(xiàn)marker的插入,但大小會隨figure的大小變化,而且也不能改變方向。

進一步完善代碼如下:

from matplotlib import pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
import numpy as np
'圖片插入(大小不變)'
N = 100
x = np.linspace(0, 10, N)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(x, y)
img = plt.imread('icon\\icon-test.png')
im = OffsetImage(img, zoom=0.3)
ab = AnnotationBbox(im, (x[0],y[0]), xycoords='data', frameon=False)
ax.add_artist(ab)
plt.show()

此時插入的marker不再隨figure大小的變化而變化,但還不能做到自定義旋轉(zhuǎn)角度,如果要實現(xiàn)該功能,則可以通過定義旋轉(zhuǎn)矩陣,將plt.imread讀取的圖片數(shù)據(jù)img進行旋轉(zhuǎn)變換以實現(xiàn)對marker的角度旋轉(zhuǎn)。

但這種方法仍然不同靈活,不像真正的“marker”,而且效率也不高。

下面介紹如何通過Path實現(xiàn)自定義marker。

通過Path實現(xiàn)自定義marker

from matplotlib import pyplot as plt
from matplotlib.path import Path
import numpy as np
'通過Path類自定義marker'
#定義旋轉(zhuǎn)矩陣
def rot(verts, az):
    #順時針旋轉(zhuǎn)
    rad = az / 180 * np.pi
    verts = np.array(verts)
    rotMat = np.array([[np.cos(rad), -np.sin(rad)], [np.sin(rad), np.cos(rad)]])
    transVerts = verts.dot(rotMat)
    return transVerts
iconMat = np.array([[-1.414, 1.414],
			[0, 0],
			[2.828, 2.828],
			[0, 0],
			[-1.414, 1.414]])
class CustomMarker(Path):
    def __init__(self, icon, az):
         if icon == "icon": 
             verts = iconMat  
         vertices = rot(verts, az)  
         super().__init__(vertices)
N = 30
x = np.linspace(0, 10, N)
y = np.sin(x)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(x, y, marker=IconMarker("icon", 20), c="red", s=1000)
plt.show()

實現(xiàn)效果如上圖所示,就像普通的marker一樣,大小固定,不隨figure大小變化,而且可以調(diào)節(jié)方向(旋轉(zhuǎn))。 

實現(xiàn)的主要原理是

matplotlib中的plot和scatter繪圖函數(shù)中的marker關(guān)鍵字傳遞的值會被matplotlib.markers中的MarkerStyle類處理,而MarkerStyle類中的set_marker是可以處理path對象的。

因此,先生成自定義的marker的Path對象的路徑點參數(shù),然后定義旋轉(zhuǎn)矩陣,根據(jù)旋轉(zhuǎn)角度對路徑點參數(shù)進行旋轉(zhuǎn),生成指定方向的marker的Path對象的路徑點參數(shù)。

剩下的marker的大小/顏色等可由MarkerStyle類或plot/scatter函數(shù)其他相關(guān)的關(guān)鍵字屬性自動處理。

https://stackoverflow.com/questions/11487797/python-matplotlib-basemap-overlay-small-image-on-map-plot 

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python中if和elif的用法示例及區(qū)別詳解

    Python中if和elif的用法示例及區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于Python中if和elif的用法示例及區(qū)別的相關(guān)資料,除了基本的if和else語句外,elif(即else?if)也是一個非常重要的組成部分,需要的朋友可以參考下
    2024-04-04
  • 12個Python程序員面試必備問題與答案(小結(jié))

    12個Python程序員面試必備問題與答案(小結(jié))

    這篇文章主要介紹了12個Python程序員面試必備問題與答案,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-06-06
  • python實現(xiàn)差分隱私Laplace機制詳解

    python實現(xiàn)差分隱私Laplace機制詳解

    今天小編就為大家分享一篇python實現(xiàn)差分隱私Laplace機制詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • 一文搞懂Python?List和Tuple的區(qū)別

    一文搞懂Python?List和Tuple的區(qū)別

    list和tuple都是可迭代對象中的容器序列,能夠存放不同類型的數(shù)據(jù),并且存的是它們所包含的任意類型的對象的引用,這算是兩者之間的一個相同點,本文詳細(xì)給大家介紹了Python?List和Tuple的區(qū)別,需要的朋友可以參考下
    2025-05-05
  • Python中的is和id用法分析

    Python中的is和id用法分析

    這篇文章主要介紹了Python中的is和id用法,實例分析了is和id的功能及使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-01-01
  • python3的print()函數(shù)的用法圖文講解

    python3的print()函數(shù)的用法圖文講解

    在本篇內(nèi)容里小編給各位分享的是關(guān)于python3的print()函數(shù)的用法知識點,對此有需要的朋友們跟著學(xué)習(xí)下吧。
    2019-07-07
  • 學(xué)習(xí)win32com操作word之Range精講

    學(xué)習(xí)win32com操作word之Range精講

    這篇文章主要為大家介紹了win32com操作word之Range精講學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • 在Python下嘗試多線程編程

    在Python下嘗試多線程編程

    這篇文章主要介紹了在Python下多線程編程的嘗試,由于GIL的存在,多線程在Python開發(fā)領(lǐng)域一直是個熱門問題,需要的朋友可以參考下
    2015-04-04
  • 利用ImageAI庫只需幾行python代碼實現(xiàn)目標(biāo)檢測

    利用ImageAI庫只需幾行python代碼實現(xiàn)目標(biāo)檢測

    這篇文章主要介紹了利用ImageAI庫只需幾行python代碼超簡實現(xiàn)目標(biāo)檢測功能,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-08-08
  • Django中select_related查詢優(yōu)化的具體實現(xiàn)

    Django中select_related查詢優(yōu)化的具體實現(xiàn)

    本文介紹了Django ORM中的N+1查詢問題及其解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-12-12

最新評論

眉山市| 凉山| 永康市| 独山县| 泰来县| 蓬安县| 亚东县| 类乌齐县| 丽江市| 建始县| 遵化市| 静海县| 台北县| 樟树市| 西峡县| 九寨沟县| 全椒县| 河源市| 阿合奇县| 瑞昌市| 三门峡市| 宜城市| 安阳县| 永新县| 苏尼特右旗| 三台县| 申扎县| 大关县| 洞头县| 瓦房店市| 德惠市| 宜君县| 阳谷县| 新晃| 武定县| 蓬安县| 淮北市| 丹寨县| 高台县| 尤溪县| 剑河县|