【问题标题】:quiver plot in Python using 2D arrays使用 2D 数组的 Python 中的颤动图
【发布时间】:2016-11-04 02:34:28
【问题描述】:

您好,我正在尝试使用箭袋图来创建矢量场图。这是我的逻辑和方法,我首先通过 np.arange 创建位置的 x,y 坐标,并使用 0.1 的步长。然后我为 x,y 网格划分网格。然后我将函数 Fx 的 x 分量和 y 分量 Fy 作为 .dat 文件导入 python。 .dat 文件是每个二维数组(只是一个方阵)。然后我对网格化的 x,y 坐标和 Fx,Fy 2d 数组使用 quiver 命令。然而,就我所期望的而言,颤动图输出根本没有多大意义。

我忽略的代码是否存在问题?如果步长不是整数, np.arange 是否有效?我打印出所有数组以手动检查数据,一切似乎都很好。

会不会是我的四个二维数组的形状不一样?我导入的两个 .dat 文件都是 40x40 方阵。不确定这是否与我网格化的网格匹配良好。

除此之外,我不确定问题是什么。任何帮助或建议将不胜感激。如果有帮助,我可以在我的 .dat 文件中添加数据。谢谢! (我已经检查了有关堆栈溢出的所有其他示例以解决此问题,看来我的代码在逻辑上是正确的,所以我非常卡住)

import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt('file1.dat')
data2 = np.genfromtxt('file2.dat')

nx = 2
ny = 2
x=np.arange(-nx,nx,0.1)
y=np.arange(-ny,ny,0.1)
xi,yi=np.meshgrid(x,y)
Fx = data[::5] #picks out every 5 rows in the matrix
Fy = data2[::5] 
#print(Fx)
#print(Fy)
#print(xi)
#print(yi)

plt.axes([0.065, 0.065, 0.9, 0.9])
plt.quiver(xi,yi,Fx,Fy, alpha=.5)
plt.quiver(xi,yi,Fx,Fy, edgecolor='k',facecolor='none', linewidth=.5)

plt.show()

编辑:.dat 文件如下所示。如果有办法导入 .dat 文件,请告诉我,我意识到这是很多数字,而且格式很糟糕。首先列出 Fx,然后是 Fy 数组。我期待一个非常漂亮的颤动图,其中我有某种圆形图案/圆形流动。箭头应全部形成顺时针和/或逆时针流动。

  -30.9032192      0.512708426      0.511251688      0.508112907      0.503038108      0.495766401      0.486015081      0.473499298      0.457935333      0.439051390      0.416606665      0.390406251      0.360321403      0.326310992      0.288441181      0.246901810      0.202013552      0.154238343      0.104165822       5.24933599E-02   0.00000000      -5.24933599E-02 -0.104165822     -0.154238343     -0.202013552     -0.246901810     -0.288441181     -0.326310992     -0.360321403     -0.390406251     -0.416606665     -0.439051390     -0.457935333     -0.473499298     -0.486015081     -0.495766401     -0.503038108     -0.508112907     -0.511251688     -0.512708426       30.9032192    

  0.640149713      0.648661256      0.646115780      0.638335168      -13.4731970      -13.0613079      0.587181866      0.561966598      0.533295572      0.501472771      0.466741979      0.429292738      0.389282435      0.346857786      0.302170664      0.255400449      0.206771404      0.156560570      0.105099753       5.27719632E-02   2.10129052E-08  -5.27718328E-02 -0.105099864     -0.156560570     -0.206771582     -0.255400449     -0.302170008     -0.346857607     -0.389282405     -0.429292321     -0.466741502     -0.501472294     -0.533295095     -0.561966538     -0.587181747       13.0613060       13.4731960     -0.638335109     -0.646115661     -0.648661256     -0.640149713    

  0.799892545      0.824215114      0.801061392      0.776797950      0.753669202      0.730814993      0.707295001      0.682291210      0.655105412      -8.68122292      -8.12608242      0.554765701      0.513439834      0.467435867      0.416336209      0.359773695      0.297508597      0.229575798      0.156477526       7.93530941E-02   6.53175791E-10  -7.93530941E-02 -0.156477645     -0.229576021     -0.297508597     -0.359773695     -0.416336179     -0.467435598     -0.513440192     -0.554765582       8.12608242       8.68122387     -0.655105233     -0.682291508     -0.707294881     -0.730815291     -0.753669143     -0.776797950     -0.801061392     -0.824215114     -0.799892545    

  0.940612555      0.983826339      0.933131218      0.884394646      0.842061043      0.804476202      0.769944012      0.737089813      0.704840183      0.672395170      0.639202237      0.604933023      0.569452882      0.532750905      0.494812310      -2.68859553      -2.16188312      0.365726620      0.304749787      0.205249593       6.78142031E-09 -0.205249622     -0.304749817     -0.365726680       2.16188359       2.68859553     -0.494812399     -0.532750905     -0.569453001     -0.604932964     -0.639202118     -0.672395170     -0.704840362     -0.737089515     -0.769943893     -0.804476202     -0.842061162     -0.884394407     -0.933131695     -0.983826339     -0.940612555    

  0.999167860       1.05166125      0.986028075      0.923735499      0.870001256      0.822448075      0.778727889      0.736939847      0.695574820      0.653458953      0.609715879      0.563743949      0.515199065      0.463976830      0.410177410      0.354019582      0.295616359      0.234412342      0.167968050       9.07804966E-02  -8.54922577E-10  -9.07804891E-02 -0.167968005     -0.234412268     -0.295616418     -0.354019672     -0.410177410     -0.463976830     -0.515199006     -0.563743949     -0.609715819     -0.653458893     -0.695574880     -0.736939907     -0.778727889     -0.822448075     -0.870001316     -0.923735559     -0.986028075      -1.05166125     -0.999167860    


  0.940612555      0.983826339      0.932870448      0.884094179      0.841758013      0.804004610      0.768958390      0.735091329      0.701199591      0.666386902      0.630052805      0.591893077      0.551910400      0.510422051      0.468044579      0.425626040      0.384017974      0.343483299      0.302600116     -0.377980769       8.43500270E-10  0.377980769     -0.302600116     -0.343483359     -0.384017944     -0.425625950     -0.468044549     -0.510422230     -0.551910520     -0.591892898     -0.630052805     -0.666386902     -0.701199770     -0.735090971     -0.768958986     -0.804005086     -0.841758251     -0.884094059     -0.932870448     -0.983826339     -0.940612555    


 0.799892545      0.824215114      0.807587028      0.790868759      0.775763810      0.761242151      0.746228993      0.729784787      0.711097538      0.689466000      0.664264023      -6.33222771      -5.70436525      0.561126649      0.514991641      0.460934460      0.396892428      0.320130050      0.227872163      0.119494393      -1.02303694E-08 -0.119494416     -0.227872089     -0.320129842     -0.396892160     -0.460934043     -0.514991641     -0.561126769       5.70436525       6.33222771     -0.664264023     -0.689466000     -0.711097836     -0.729784369     -0.746228993     -0.761242330     -0.775764227     -0.790868759     -0.807587445     -0.824215114     -0.799892545 

  0.640149713      0.648661256      0.658376634      0.663496077      0.663335323      -12.7135134      -12.2490902      0.630356669      0.608760655      0.581994295      0.550120413      0.513214111      0.471384048      0.424800932      0.373717010      0.318486720      0.259573966      0.197552294      0.133099481       6.69753179E-02  -1.07370708E-08  -6.69753179E-02 -0.133099481     -0.197552368     -0.259573698     -0.318486512     -0.373717397     -0.424800485     -0.471384078     -0.513214111     -0.550120771     -0.581994355     -0.608760655     -0.630356669       12.2490902       12.7135134     -0.663335383     -0.663496077     -0.658376753     -0.648661256     -0.640149713    

 -30.9032192      0.512708426      0.511251688      0.508112907      0.503038108      0.495766401      0.486015081      0.473499298      0.457935333      0.439051390      0.416606665      0.390406251      0.360321403      0.326310992      0.288441181      0.246901810      0.202013552      0.154238343      0.104165822       5.24933599E-02   0.00000000      -5.24933599E-02 -0.104165822     -0.154238343     -0.202013552     -0.246901810     -0.288441181     -0.326310992     -0.360321403     -0.390406251     -0.416606665     -0.439051390     -0.457935333     -0.473499298     -0.486015081     -0.495766401     -0.503038108     -0.508112907     -0.511251688     -0.512708426       30.9032192   

现在 Fy 数组:

 -0.205083355     -0.525830388     -0.552687049     -0.580741763     -0.609929502     -0.640149713     -0.671258569     -0.703064799     -0.735320449     -0.767719150     -0.799892545     -0.831412077     -0.861791074     -0.890495777     -0.916961849     -0.940612555     -0.960886896     -0.977269113     -0.989315629     -0.996686459     -0.999167860     -0.996686459     -0.989315629     -0.977269113     -0.960886896     -0.940612555     -0.916961849     -0.890495777     -0.861791074     -0.831412077     -0.799892545     -0.767719150     -0.735320449     -0.703064799     -0.671258569     -0.640149713     -0.609929502     -0.580741763     -0.552687049     -0.525830388     -0.205083355    
 -0.495766401     -0.496165156     -0.509083092     -0.549605310       13.5129404       13.0519953     -0.646288395     -0.672055602     -0.695797563     -0.717920899     -0.738660455     -0.758110344     -0.776252687     -0.792979062     -0.808119476     -0.821464479     -0.832787395     -0.841867268     -0.848508835     -0.852558434     -0.853919387     -0.852558374     -0.848508716     -0.841867328     -0.832787514     -0.821464896     -0.808119833     -0.792978704     -0.776252151     -0.758110642     -0.738660395     -0.717920780     -0.695797503     -0.672055602     -0.646288335       13.0519953       13.5129395     -0.549605191     -0.509083092     -0.496165156     -0.495766401    

 -0.416606665     -0.387658477     -0.370003909     -0.412325561     -0.451486528     -0.484789789     -0.512974977     -0.536900580     -0.557342112       8.73137856       8.12754345     -0.604040861     -0.616312325     -0.627466083     -0.637651145     -0.646887839     -0.655064702     -0.661947429     -0.667217672     -0.670547307     -0.671688557     -0.670547426     -0.667217493     -0.661947429     -0.655064702     -0.646887779     -0.637651086     -0.627466381     -0.616312623     -0.604041040       8.12754345       8.73137951     -0.557341993     -0.536900103     -0.512975276     -0.484789670     -0.451485991     -0.412325561     -0.370003909     -0.387658477     -0.416606665   

 -0.246901810     -0.228335708     -0.217398927     -0.246074528     -0.271431714     -0.291785061     -0.307664692     -0.319617361     -0.328106791     -0.333535194     -0.336277753     -0.336733580     -0.335400879     -0.333002120     -0.330682963       2.81363893       2.24033999     -0.348281264     -0.372185618     -0.395866930     -0.403591305     -0.395866960     -0.372185677     -0.348281264       2.24033999       2.81363893     -0.330682874     -0.333002120     -0.335400909     -0.336733490     -0.336277664     -0.333535045     -0.328106642     -0.319617361     -0.307664692     -0.291785270     -0.271431714     -0.246074289     -0.217398927     -0.228335708     -0.246901810    
   0.00000000      -3.97699699E-02  -8.22334886E-02  -9.01840925E-02  -9.43243951E-02  -9.68469381E-02  -9.79287177E-02  -9.75681171E-02  -9.57226083E-02  -9.23085213E-02  -8.71856511E-02  -8.01347122E-02  -7.08276853E-02  -5.87978214E-02  -4.34263758E-02  -2.40071025E-02  -4.12676527E-05   2.79203784E-02   5.66387177E-02   7.90976062E-02   8.76100808E-02   7.90975988E-02   5.66387326E-02   2.79204026E-02  -4.12871887E-05  -2.40071043E-02  -4.34263758E-02  -5.87978400E-02  -7.08276406E-02  -8.01346377E-02  -8.71856511E-02  -9.23085883E-02  -9.57226381E-02  -9.75680798E-02  -9.79286432E-02  -9.68469679E-02  -9.43244398E-02  -9.01841149E-02  -8.22335258E-02  -3.97699960E-02   0.00000000    

 0.246901810      0.149554759       5.41899577E-02   6.69130459E-02   8.30149651E-02   9.62892994E-02  0.106718197      0.114569001      0.119987577      0.122970015      0.123354375      0.120809816      0.114815064      0.104622498       8.91864598E-02   6.69886991E-02   3.55363674E-02  -1.02187870E-02  -8.21609423E-02 -0.177876130     -0.191068053     -0.177876085      -8.21608678E-02  -1.02187609E-02   3.55363339E-02   6.69886544E-02   8.91865119E-02  0.104622573      0.114814982      0.120810024      0.123354279      0.122969493      0.119987287      0.114568666      0.106718197       9.62890834E-02   8.30147490E-02   6.69130459E-02   5.41902333E-02  0.149555355      0.246901810    

 0.416606665      0.324635506      0.239433557      0.271107137      0.304715306      0.333829224      0.358776420      0.380251735      0.398895025      0.415270001      0.429880798      -6.52393579      -5.84947205      0.467720896      0.479777455      0.492111117      0.504699171      0.516976655      0.527697802      0.535157621      0.537844956      0.535157681      0.527697802      0.516976714      0.504699290      0.492111027      0.479777277      0.467720628      -5.84947205      -6.52393579      0.429880500      0.415270001      0.398895413      0.380252063      0.358776003      0.333829224      0.304715246      0.271106362      0.239433587      0.324635804      0.416606665    

 0.495766401      0.468931794      0.452914894      0.491556555      0.528390408      -12.8101072      -12.3052654      0.617275119      0.641844690      0.664552093      0.685565233      0.704941750      0.722658634      0.738638997      0.752775729      0.764953554      0.775063336      0.783014059      0.788738489      0.792190075      0.793342948      0.792190075      0.788738668      0.783013999      0.775063157      0.764953852      0.752775729      0.738638759      0.722658694      0.704941571      0.685565174      0.664552152      0.641844690      0.617275119      -12.3052645      -12.8101072      0.528390408      0.491556555      0.452914953      0.468931794      0.495766401  

0.512708426      0.525830388      0.552687049      0.580741763      0.609929502      0.640149713      0.671258569      0.703064799      0.735320449      0.767719150      0.799892545      0.831412077      0.861791074      0.890495777      0.916961849      0.940612555      0.960886896      0.977269113      0.989315629      0.996686459      0.999167860      0.996686459      0.989315629      0.977269113      0.960886896      0.940612555      0.916961849      0.890495777      0.861791074      0.831412077      0.799892545      0.767719150      0.735320449      0.703064799      0.671258569      0.640149713      0.609929502      0.580741763      0.552687049      0.525830388      0.512708426   

【问题讨论】:

  • 您能否发布FxFy 以及预期结果的描述和/或为什么您得到的结果不是您所期望的?
  • 您确定您使用的是相同的数据吗?从您提供的数据中,第一个元素是 -30,这未在上图中显示。此外,您如何在 2D 中绘制 Fy(x,0)?你如何确定x的值。
  • @hashmuke 再次感谢您的沟通和帮助。所以,这个数据是 Fy(x,0) 的图,第一个元素是 -.20。然而,我实际上为上面的 2D 图绘制了从 -15 到 15 的 x,而不是在下面的 quiver 图中所做的 -2 到 2。我在 quiver 图中使用了从 -2 到 2 的 x,这样我就可以在此处导入一个点数较少的 .dat 文件。我的 x,y 实际上从 -15 运行到 15。
  • @hashmuke 我在我的 fortran 代码中确定一维图中 x 的值。我将具有 2 个列的 .dat 文件导入 python,一列 x 轴,另一列是 Fy(x,0)。 x 值只是 -15 到 15,步长为 0.1。你想让我制作 x 轴从 -2 到 2 的 2D 绘图,如下图所示?并上传那个情节?如果你想在私人聊天中或通过其他地方,我可以向你展示整个 dat 文件,没有数据拼接,x,y 从 -15 到 15。所以 Fx,Fy 2D 数组实际上是 300 x 300 矩阵因为我的步长是 0.1。
  • 您可以使用filedropper.com 等工具分享完整数据吗?您在上面粘贴的那个不在 -1 和 1 之间。

标签: python matplotlib


【解决方案1】:

沿着y=xy=-x 的行似乎存在异常大的值(可能是渐近奇点的指示?)。

您可以在您发布的the data 中看到这一点。例如,考虑第一行:

  -31.3490391       6.68895245E-02   6.68859407E-02   ... -6.68895245E-02   31.3490391    

第一个值是大的负数,后面是小的正数。在行尾附近,数字很小且为负,而最后一个值较大且为正。显然,就目前而言,这些数据不会产生平滑变化的颤动图。

如果我们删除这些异常大的值:

data[np.abs(data) > 1] = np.nan
data2[np.abs(data2) > 1] = np.nan

然后

import numpy as np
import matplotlib.pyplot as plt

data = np.genfromtxt('file1.dat')
data2 = np.genfromtxt('file2.dat')

data[np.abs(data) > 1] = np.nan
data2[np.abs(data2) > 1] = np.nan

N = 10
Fx = data[::N, ::N]
Fy = data2[::N, ::N]

nrows, ncols = Fx.shape
nx = 2
ny = 2
x = np.linspace(-nx, nx, ncols)
y = np.linspace(-ny, ny, nrows)
xi, yi = np.meshgrid(x, y, indexing='ij')

plt.axes([0.065, 0.065, 0.9, 0.9])
plt.quiver(xi, yi, Fx, Fy, alpha=.5)
plt.quiver(xi, yi, Fx, Fy, edgecolor='k', facecolor='none', linewidth=.5)

plt.show()

产量


data 是形状为 (301, 301) 的二维数组:

In [109]: data.shape
Out[109]: (301, 301)

如果我们使用data[::10]data 进行切片,则结果具有形状

In [113]: data[::10].shape
Out[113]: (31, 301)

请注意,只有第一个轴被切片。要对第一个轴和第二个轴进行切片,请使用 data[::10, ::10]

In [114]: data[::10, ::10].shape
Out[114]: (31, 31)

有关多维切片的更多信息,请参阅the docs。 始终注意 NumPy 数组的形状。它通常是理解 NumPy 操作的关键。


虽然plt.quiver 有时可以接受不同形状的数组, 通过传递四个相同形状的数组,最容易使用plt.quiver。 为确保xi, yi, Fx, Fy 都具有相同的形状,将datadata2 切片以形成FxFy 首先,然后构建xiyi 以符合到FxFy 的(常见)形状:

nrows, ncols = Fx.shape
x = np.linspace(-nx, nx, ncols)
y = np.linspace(-ny, ny, nrows)

np.linspace 的第三个参数表示 返回数组。

【讨论】:

  • 这很有意义。我确实注意到了异常大的值,但完全不确定如何处理它们,现在我明白了。我对您的代码有一个问题。为什么你使用 Fx = data[::N,::N] 而不仅仅是 Fx=data[::N]?究竟有什么区别?我知道 [::N] 做了什么,只是不知道 [::N,::N] 做了什么。这看起来比我拥有的任何东西都好,非常感谢。我认为现在的问题可能在于我如何在 fortran 中实际生成 Fx.dat、Fy.dat 的数据,因为箭袋图仍然不是我预期的样子,但我知道你的代码是正确的。非常感谢!
  • 我在上面添加了解释。
  • 非常感谢。我对 python 很陌生,并且从你所展示的内容中学到了很多东西。我现在只需要考虑所有这些,如果我还有任何问题,我会告诉你。
  • 您好,只有一个问题要问您。我在 plt.quiver 命令中切换了 Fx,Fy,它产生了正确的绘图。你知道这怎么可能吗?非常感谢!
  • 在处理(x,y)坐标时,第一个坐标指的是横轴,第二个指的是纵轴。但是在处理具有(i,j) 坐标的二维 NumPy 数组时,第一个坐标指的是(垂直)行,第二个坐标指的是(水平)列。这个fundamental inconsistency 在绘制数组时经常抬起丑陋的脑袋。您可以使用:xi, yi = np.meshgrid(x, y, indexing='ij'),而不是交换 FxFy
【解决方案2】:

首先确保FxFy 的维度相同,以避免混淆。然后根据数据维度生成网格空间维度。您可以使用np.linspace 代替np.arange 作为:

x = np.linspace(-nx, nx, Fx.shape[1])
y = np.linspace(-ny, ny, Fx.shape[0])

更新: 完整代码如下:

import numpy as np
import matplotlib.pyplot as plt

# Fxdata.dat contain Fx data while Fydata.dat is Fy downloaded from the provided link
Fx = np.genfromtxt('Fxdata.dat')
Fy = np.genfromtxt('Fydata.dat')

# input data dimensions 
num_Fx = Fx.shape[0]    # number of lines for the data in file1.dat
length_Fx = Fx.shape[1]  # length of each row for file1.dat 

nx = 15
ny = 15

# you can generate the grid points based on the dimensions of the input data
x = np.linspace(-nx, nx, length_Fx)
y = np.linspace(-ny, ny, num_Fx)

# grid points 
xi,yi=np.meshgrid(x,y)

#
plt.axes([0.065, 0.065, 0.9, 0.9])
plt.quiver(xi,yi,Fx,Fy, alpha=.5)
#plt.quiver(xi,yi,Fx,Fy, edgecolor='k',facecolor='none', linewidth=.5)

plt.show()

不确定现在是否有意义,但结果图如下:

【讨论】:

  • 您是否也将Fx = data[::5] 更改为Fx = data 并同样更改为Fy
  • 我使用了你提供的FxFy,它们的尺寸是9X41。
  • 你用过Fx = np.genfromtxt('file1.dat')吗? (只是试图帮助 OP 重现您的结果。)
  • 对不起@ubutbu,我虽然你问了这个问题,但现在我知道了。是的,这是正确的。我将数据保存到两个文件中,并使用np.genfromtxt 直接将它们加载到FxFy
  • @hashmuke 非常感谢,您可以上传您使用的其余代码吗?我不完全确定您是如何导入数据的。我有几个问题,Fx.shape[1], Fy.shape[0] 指的是什么? [1] 和 [0] 是干什么用的?再次感谢!另外,为什么有些箭头相对于其他箭头很大,仅仅是因为数据集吗?
猜你喜欢
  • 1970-01-01
  • 2013-07-09
  • 2020-05-26
  • 1970-01-01
  • 2021-09-27
  • 1970-01-01
  • 2014-05-21
  • 2012-12-09
  • 2017-08-26
相关资源
最近更新 更多