python - 在同一坐标中绘制/散点位置和标记大小

标签 python graphics plot matplotlib

我正在尝试以编程方式在 pylab 中显示各种类型的图表。 pylab 的 scatter 函数在其轴的不同坐标处显示标记,但标记大小以像素为单位。这对于日常图表来说是有意义的。但是,我想在相同的坐标中给出坐标和标记大小!例如,以下代码在 (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 等)很感兴趣。

最佳答案

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

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

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,如果是,则将其设为数组)。

关于python - 在同一坐标中绘制/散点位置和标记大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5009316/

相关文章:

plot - 将 Mathematica 的绘图选项保存到单个变量中

python - 扩展 Google Appstats

python - 如果我不关闭一个 mysql 连接并打开另一个连接,会发生什么情况?

python - 使用 R 或 python 在坐标系中绘制向量

ios - 大小可以为 -[NSString drawInRect :] be determined by the string's content?

.net - 在 WPF 应用程序上与艺术家合作的最佳方式是什么?

r - 如何在ggplot中绘制高于和低于零的值的密度?

python - H2OPython : Extract grid search model that with highest AUC on validation data set

Python opencv 返回 Bad Properties

algorithm - 两个旋转矩形的交点面积