如何将圆圈放在多边形的顶部?

时间:2014-09-19 12:07:13

标签: python matplotlib

我使用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))

1 个答案:

答案 0 :(得分:2)

您正在寻找zorder

在matplotlib中,所有其他参数都是在类heirarchy中传递的。 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较高的对象位于值较低的对象之上。