最新国产好看的视频,伊人天堂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來實(shí)現(xiàn)。

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

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

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

marker的特點(diǎn)

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

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

通過插入圖片實(shí)現(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()

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

進(jìn)一步完善代碼如下:

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)角度,如果要實(shí)現(xiàn)該功能,則可以通過定義旋轉(zhuǎn)矩陣,將plt.imread讀取的圖片數(shù)據(jù)img進(jìn)行旋轉(zhuǎn)變換以實(shí)現(xiàn)對marker的角度旋轉(zhuǎn)。

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

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

通過Path實(shí)現(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()

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

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

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

因此,先生成自定義的marker的Path對象的路徑點(diǎn)參數(shù),然后定義旋轉(zhuǎn)矩陣,根據(jù)旋轉(zhuǎn)角度對路徑點(diǎn)參數(shù)進(jìn)行旋轉(zhuǎn),生成指定方向的marker的Path對象的路徑點(diǎn)參數(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)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(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實(shí)現(xiàn)差分隱私Laplace機(jī)制詳解

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

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

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

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

    Python中的is和id用法分析

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

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

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

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

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

    在Python下嘗試多線程編程

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

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

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

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

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

最新評論

渭南市| 桃园市| 米脂县| 三门县| 无锡市| 南宫市| 屏东县| 贵州省| 池州市| 娄烦县| 响水县| 浑源县| 桐乡市| 深水埗区| 井陉县| 道孚县| 鄂伦春自治旗| 石林| 光泽县| 高安市| 旬阳县| 玛纳斯县| 石首市| 三台县| 宾川县| 文成县| 林芝县| 聂拉木县| 罗江县| 襄樊市| 山西省| 北辰区| 永登县| 焦作市| 桂阳县| 铁力市| 利辛县| 育儿| 周至县| 北票市| 济宁市|