2014-09-19 46 views
0

我使用matplotlib通過以下方式來生成圖像:如何在多邊形頂部放置圓?

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.fill(border[0],border[1], color='g', linewidth=1, fill=True, alpha = 0.5) 
patches = [] 
for x1,y1,r in zip(x, y, radii): 
    circle = Circle((x1,y1), r) 
    patches.append(circle) 
p = PatchCollection(patches, cmap='cool', alpha=1.0) 
p.set_array(c) 
ax.add_collection(p) 
plt.colorbar(p) 
plt.savefig(fig_name) 

我想有一個多邊形(通過其邊界給出)和彩色圓圈這個多邊形的頂部。但是,我在圓圈頂部找到了多邊形。

這很奇怪,因爲我先繪製了多邊形,然後向圖中添加了圓圈。

有人知道它爲什麼會發生,以及如何解決這個問題?

ADDED

按照要求,在這裏是完全工作的例子:

import pandas 

import matplotlib 
import matplotlib.pyplot as plt 
from matplotlib.collections import PatchCollection 
from matplotlib.patches import Circle, Polygon 
import numpy as np 

def plot_xyc(df, x_col, y_col, c_col, radius, fig_name, title, zrange): 


    resolution = 50 

    x = df[x_col] 
    y = df[y_col] 
    c = df[c_col] 

    x0 = (max(x) + min(x))/2.0 
    y0 = (max(y) + min(y))/2.0 

    dx = (max(x) - min(x)) 
    dy = (max(y) - min(y)) 

    delta = max(dx, dy) 

    radii = [delta*radius for i in range(len(x))] 

    fig = plt.figure() 
    plt.title(title) 

    ax = fig.add_subplot(111) 


    border = ([-3, 3, 3, -3], [-3, -3, 3, 3]) 

    ax.fill(border[0],border[1], color='g', linewidth=1, fill=True, alpha = 1.0) 

    patches = [] 
    for x1,y1,r in zip(x, y, radii): 
     circle = Circle((x1,y1), r) 
     patches.append(circle) 


    patches.append(Circle((-100,-100), r)) 
    patches.append(Circle((-100,-100), r)) 

    p = PatchCollection(patches, cmap='cool', alpha=1.0) 

    p.set_array(c) 
    max_ind = max(c.index) 
    c.set_value(max_ind + 1, min(zrange)) 
    c.set_value(max_ind + 2, max(zrange)) 


    plt.xlim([x0 - delta/2.0 - 0.05*delta, x0 + delta/2.0 + 0.05*delta]) 
    plt.ylim([y0 - delta/2.0 - 0.05*delta, y0 + delta/2.0 + 0.05*delta]) 

    ax.add_collection(p) 


    plt.colorbar(p) 

    plt.savefig(fig_name) 

if __name__ == '__main__': 

    df = pandas.DataFrame({'x':[1,2,3,4], 'y':[4,3,2,1], 'z':[1,1,2,2]}) 

    plot_xyc(df, 'x', 'y', 'z', 0.1, 'test2.png', 'My Titlle', (0.0, 3.0)) 
+0

你能提供一個完整的工作示例嗎? – Ffisegydd 2014-09-19 12:10:39

回答

2

您正在尋找zorder

在matplotlib中,所有附加參數只是傳遞給類的層次結構。 zorderArtist類的kwarg,所以你只需要確保它在某個時候得到zorder

你可以在你的例子中用兩種方法做到這一點;

要麼將​​其添加在這裏:

ax.fill(border[0],border[1], color='g', linewidth=1, fill=True, alpha = 1.0, zorder=1) 

或在這裏:

p = PatchCollection(patches, cmap='cool', alpha=1.0, zorder=2) 

,或者如果你想兩者兼而有之。 zorder較高的對象位於值較低的對象之上。