matplotlib 中 np.meshgrid() 的坐标密度变化

Change in coordinate density for np.meshgrid() in matplotlib

我正在使用 numpy 函数 quiver() 绘制矢量场并且它有效。但我想强调以下情节中的牛仔:

我不确定该怎么做,但增加中心箭头的密度可能会有所帮助。为此,我想求助于 np.meshgrid() 中的某些选项,这将使我能够在中心获得更紧密的 x、y 坐标点。线性,二次或其他规格似乎没有内置。我不确定sparse是否可以为此修改

代码:

lim = 10
int = 0.22 *lim
x,y = np.meshgrid(np.arange(-lim, lim, int), np.arange(-lim, lim, int))

u = 3 * np.cos(np.arctan2(y,x)) - np.sqrt(x**2+y**2) * np.sin(np.arctan2(y,x))
v = 3 * np.sin(np.arctan2(y,x)) + np.sqrt(x**2+y**2) * np.cos(np.arctan2(y,x))

color = x**2 + y**2
plt.rcParams["image.cmap"] = "Greys_r"
mult = 1
plt.figure(figsize=(mult*lim, mult*lim))
plt.quiver(x,y,u,v,color, linewidths=.006, lw=.1)
plt.show()

关闭这个循环,多亏了接受的答案,我终于能够在网格密度之间取得平衡,就像我从@flwr 那里学到的那样,并保持矢量场的“cowlick”结构显眼(尽量避开原点周围的放射状结构):

np.meshgrid 只是将您提供的矢量制作成网格。 你可以做的是在中心收缩这个规则的网格以在中心有更多的点(最好用更多的点可见),例如像这样:

# contract in the center
a = 0.5  # how far to contract
b = 0.8  # how strongly to contract
c = 1 - b*np.exp(-((x/lim)**2 + (y/lim)**2)/a**2)
x, y = c*x, c*y
plt.plot(x,y,'.k')
plt.show()

或者,您可以 x,y 完全不依赖于网格的坐标:

x = np.random.randn(500)
y = np.random.randn(500)
plt.plot(x,y,'.k')
plt.show()

但我认为您更喜欢稍微规则一些的模式,您可以研究具有自适应距离的泊松圆盘采样或类似的东西,但这里的关键点是使用 quiver,您可以使用任何一组坐标,它们不必位于规则网格中。

你可以在任何你想计算场的地方构建点,quivers 会很高兴的。下面的代码使用极坐标并拉伸径向坐标 non-linearly.

import numpy as np
import matplotlib.pyplot as plt

lim = 10
N = 10

theta = np.linspace(0.1, 2*np.pi, N*2)

stretcher_factor = 2

r = np.linspace(0.3, lim**(1/stretcher_factor), N)**stretcher_factor

R, THETA = np.meshgrid(r, theta)
x = R * np.cos(THETA)
y = R * np.sin(THETA)

# x,y = np.meshgrid(x, y)
r = x**2 + y**2

u = 3 * np.cos(THETA) - np.sqrt(r) * np.sin(THETA)
v = 3 * np.sin(THETA) + np.sqrt(r) * np.cos(THETA)

plt.rcParams["image.cmap"] = "Greys_r"
mult = 1
plt.figure(figsize=(mult*lim, mult*lim))
plt.quiver(x,y,u,v,r, linewidths=.006, lw=.1)

编辑:两次使用 meshgrid 的错误