簡體   English   中英

matplotlib 自定義路徑標記未正確顯示

[英]matplotlib custom path markers not displaying correctly

只是想知道是否有人對 matplotlib 自定義標記有經驗

我希望 plot 中的每個標記都是餅圖。 為此,我的策略是使用路徑 class 方法楔形創建自定義標記。

https://matplotlib.org/stable/api/path_api.html

但是顯示不正確,尤其是在左象限中使用角度定義的楔形。 但是,楔形 class 方法定義的路徑似乎是正確的,如果使用 PathPatch 和 .add_patch(),楔形可以正確顯示

請參閱下面的示例

import numpy as np
import math
import matplotlib.path as mpath
import matplotlib.cm
import matplotlib.pyplot as plt
import matplotlib.patches as patches

#Create wedges from angles
angles = np.array( [0,140,160,360] ) #Wedges angles
wedges=[]
for i in range(len(angles)-1):
    angle0= angles[i]
    angle1= angles[i+1]
    
    dangle = angle1-angle0

    wedge0=None
    if dangle>0:
        wedge0= mpath.Path.wedge(angle0, angle1)
    wedge0= mpath.Path.wedge(angle0, angle1)
    wedges.append(wedge0)

fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121)
ax1.set_xlim(-1, 1)
ax1.set_ylim(-1, 1)

ax2 = fig.add_subplot(122)
ax2.set_xlim(-2, 2)
ax2.set_ylim(-2, 2)

tab10 = matplotlib.cm.get_cmap('tab10')

for i, w0 in enumerate(wedges):
    ax1.scatter(0,0, marker=w0, c = [tab10(i)], s=20000) #Use path markers
    
    patch = patches.PathPatch(w0, color=tab10(i)) #Use patch
    ax2.add_patch(patch)

plt.show()

情節產生

請注意,左側 plot 的楔子伸出來,這是不應該的。

這是 matplotlib 標記代碼中的錯誤嗎?

我設法讓餅圖正確顯示。

通過仿射變換進行縮放並沒有幫助,因為路徑標記都已調整大小,如 Markers.py 的第 495 行

def _set_custom_marker(self, path):
    rescale = np.max(np.abs(path.vertices))  # max of x's and y's.
    self._transform = Affine2D().scale(0.5 / rescale)
    self._path = path

我的解決方案是通過插入定義邊界框的新頂點來修改創建的楔形中的頂點,該邊界框略大於半徑為 1 的圓。

這是修改后的代碼

import numpy as np
import matplotlib.path as mpath
import matplotlib.cm
import matplotlib.pyplot as plt
import matplotlib.patches as patches

def getBoundedWedge(angle0, angle1):
    wedge0= mpath.Path.wedge(angle0, angle1)
    #print(f"wedge0:{wedge0}")

    vertices = wedge0.vertices
    codes = wedge0.codes

    #Add ghost vertices to define bounding box
    vertices= np.insert( vertices, 0, [[1.1,1.1], [-1.1,1.1] , [-1.1,-1.1], [1.1,-1.1]] , axis=0)
    codes = np.insert( codes, 0, [1,1,1,1])

    wedgeextra = mpath.Path(vertices, codes)
    
    return wedgeextra

#Create wedges from angles
angles = np.array( [0,140,160,360] ) #Wedges angles
wedges=[]
for i in range(len(angles)-1):
    angle0= angles[i]
    angle1= angles[i+1]
    
    dangle = angle1-angle0

    wedge0=None
    if dangle>0:
        wedge0= getBoundedWedge(angle0, angle1)
    wedges.append(wedge0)

fig = plt.figure(figsize=(10,5))
ax1 = fig.add_subplot(121)
ax1.set_xlim(-1, 1)
ax1.set_ylim(-1, 1)

ax2 = fig.add_subplot(122)
ax2.set_xlim(-2, 2)
ax2.set_ylim(-2, 2)

tab10 = matplotlib.cm.get_cmap('tab10')

for i, w0 in enumerate(wedges):
    ax1.scatter(0,0, marker=w0, c = [tab10(i)], s=20000) #Use path markers
    
    patch = patches.PathPatch(w0, color=tab10(i)) #Use patch
    ax2.add_patch(patch)

plt.show()

而output如下

輸出

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM