在相同坐标中绘制/分散位置和标记大小

时间:2011-02-15 20:48:22

标签: python graphics plot matplotlib

我正在尝试以编程方式在pylab中显示各种类型的图表。 pylab的散射函数在其轴的temrs中以不同的坐标显示标记,但标记大小以像素为单位。这对于日常图形图是有意义的。但是,我想在相同的坐标中给出坐标和标记尺寸!例如,以下代码在(0.0,0.0)和(0.5,0.5)处显示两个圆,每个圆的大小为20。这些应该几乎完全重叠,因为半径远大于中心之间的距离。但是,它们不是因为尺寸是像素,而位置是轴坐标。

import pylab
pylab.scatter([0,0.5], [0,0.5], s=20, c='b', marker='o')

有没有办法用相同坐标给出的尺寸和位置制作散点图(或绘制任何形状,线等)?我对矢量图形输出感兴趣(pdf,svg等)。

2 个答案:

答案 0 :(得分:13)

pylab.scatter函数根据点^ 2的大小获取值大小。这个大小将独立于轴,散射图的性质也是如此(如果您在散点图中缩小点变大,则没有意义)。

如果你想说一个给定大小的绘制圆圈,你应该在pylab中使用circle命令

import pylab
axes = pylab.axes()
circle1 = pylab.Circle((0,0), radius=20, alpha=.5)
circle2 = pylab.Circle((0.5,0.5), radius=20, alpha=.5)
axes.add_patch(circle1)
axes.add_patch(circle2)
pylab.axis('scaled')
pylab.show()

如果你需要具有像能力这样的散点图的东西,你可以做类似

的事情
import pylab
import matplotlib

def my_circle_scatter(axes, x_array, y_array, radius=0.5, **kwargs):
    for x, y in zip(x_array, y_array):
        circle = pylab.Circle((x,y), radius=radius, **kwargs)
        axes.add_patch(circle)
    return True

def my_square_scatter(axes, x_array, y_array, size=0.5, **kwargs):
    size = float(size)
    for x, y in zip(x_array, y_array):
        square = pylab.Rectangle((x-size/2,y-size/2), size, size, **kwargs)
        axes.add_patch(square)
    return True

def my_polygon_scatter(axes, x_array, y_array, resolution=5, radius=0.5, **kwargs):
    ''' resolution is number of sides of polygon '''
    for x, y in zip(x_array, y_array):
        polygon = matplotlib.patches.CirclePolygon((x,y), radius=radius, resolution=resolution, **kwargs)
        axes.add_patch(polygon)
    return True

axes=pylab.axes()
my_circle_scatter(axes, [0,0.5], [0,0.5], radius=2, alpha=.5, color='b')
my_square_scatter(axes, [-3,-4,2,3], [1,-3,0,3], size=.5, alpha=.5, color='r')
my_polygon_scatter(axes, [-1,-2,3], [-3,0,3], radius=.5, resolution=3, alpha=.5, color='g')
my_polygon_scatter(axes, [4,1.5,3], [2,-1,-3], radius=.5, resolution=5, alpha=.5, color='k')
pylab.axis('scaled')
pylab.axis([-5,5,-5,5])
pylab.show()

有关其他可绘制对象的信息,请参阅http://matplotlib.sourceforge.net/api/artist_api.html#module-matplotlib.patches

第一个代码段的示例输出: matplotlib circles

第二个代码段的示例输出: matplotlib scatter plot

编辑格里夫:如果你想为每个点处理不同的半径,你可以做一些简单的事情,如:

def my_circle_scatter_radii(axes, x_array, y_array, radii_array, **kwargs):
    for (x, y, r) in zip(x_array, y_array, radii_array):
        circle = pylab.Circle((x,y), radius=r, **kwargs)
        axes.add_patch(circle)
    return True

同时处理这两种情况的逻辑也很简单(例如,检查它的radii_array是否为int / float,如果是,则将其设为数组)。

答案 1 :(得分:2)

补丁的集合是一个更好的选择,如果你真的想让它与plt.scatter类似。假设您想在数据单元中绘制具有给定半径的圆的散布,您可以查看this post,它提供一个包含良好的函数,名为circles

如果你想使用方形或多边形等其他标记,你可以用相应的补丁重写这个函数,如jimbob博士的回答所述。

这是一个例子

from pylab import *
figure(figsize=(6,4))
ax = subplot(aspect='equal')

#plot a set of circle
a = arange(11)
circles(a, a, s=a*0.2, c=a, alpha=0.5, ec='none')
colorbar() 

#plot a circle (the lower-right one)
circles(1, 0, s=0.4, c='r', ls='--', lw=5, fc='none', transform=ax.transAxes)

xlim(0,10)
ylim(0,10)

enter image description here