仅在使用 matplotlib 的圆圈内绘制绘图 [重复]

Posted

技术标签:

【中文标题】仅在使用 matplotlib 的圆圈内绘制绘图 [重复]【英文标题】:Draw plot only inside a circle with matplotlib [duplicate] 【发布时间】:2018-04-30 11:51:33 【问题描述】:

我有分散的数据,我将其插入到网格数据中。之后,我使用 contourf 函数绘制所有内容。最后,我只想在定义的圆圈内绘制所有内容。其他一切都应该是白色的,但我不知道如何实现这一点。有没有简单的方法可以做到这一点?

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata


def func(x, y):
  return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]

points = np.random.rand(1000, 2)
values = func(points[:,0], points[:,1])


grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')

plt.contourf(grid_x,grid_y,grid_z0)

plt.savefig("plot_data_in_circle.png")

编辑:我附上从我的代码中得出的情节:

它应该是这样的:

【问题讨论】:

你能张贴一张你大致希望它看起来像什么的(MS 绘制)图片吗? :) 您拥有的选项:(a) 将不需要的值设置为 nan,(b) 屏蔽数组,(c) 使用剪辑路径。应该有这方面的例子。如果没有,了解 matplotlib 文档在哪一点可以改进会很有帮助。 我添加了一张应该是什么样子的图片;) 您是否尝试过上述任何选项?他们在什么时候失败了? 我试过
ax = plt.axes() patch = patch.Circle((0, 0), radius=0.8, transform=ax.transData) ax.set_clip_path(补丁)
【参考方案1】:

这可以通过创建一个Circle 补丁来完成,然后将其设置为clip_path

要使用clip_path,通常会存储要应用剪辑的艺术家,然后在其上使用.set_clip_path。在这种情况下,由于您使用的是contourf,因此没有方法.set_clip_path,因此我们必须遍历存储有QuadContourSetcontourf返回的PathCollections,并在每个上设置剪辑路径他们使用set_clip_path method。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
import matplotlib.patches as patches

def func(x, y):
  return x*(1-x)*np.cos(4*np.pi*x) * np.sin(4*np.pi*y**2)**2

grid_x, grid_y = np.mgrid[0:1:100j, 0:1:200j]

points = np.random.rand(1000, 2)
values = func(points[:,0], points[:,1])


grid_z0 = griddata(points, values, (grid_x, grid_y), method='nearest')

fig, ax = plt.subplots()
cs = ax.contourf(grid_x,grid_y,grid_z0)

circ = patches.Circle((0.6, 0.4), 0.3, transform=ax.transData)
for coll in cs.collections:
    coll.set_clip_path(circ)

plt.show()

【讨论】:

您知道如何将其缩放为圆形吗?我试图包括一个彩条。但这不再起作用了 你的意思是为什么它是一个椭圆而不是一个圆?那是因为轴的纵横比不相等。试试ax.set_aspect('equal'),你应该会看到一个圆圈。 好的,非常感谢!!这是一个非常好的答案;)

以上是关于仅在使用 matplotlib 的圆圈内绘制绘图 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用matplotlib使绘图的xtick标签成为简单的图形?

matplotlib:使用度数参数在极坐标系内绘制散点图

使用 Matplotlib 和 NumPy 在图像上绘制圆圈

图例中的分级尺寸符号

Matplotlib 绘图细节设置

Android Canvas:仅在透明背景上绘制圆圈