如何使用脚本自动选取数据数组维度来绘制具有 3 列(x、y、密度)的数据文件的等高线图(密度)?

问题描述 投票:0回答:1

我有一个用于绘制数据的 gnuplot 脚本,如下所示:(简化)

0 0 1.9
0 1 1.92
0 2 1.93
0 3 1.98
0 4 1.89

1 0 1.8
1 1 1.83
1 2 1.79
1 3 1.8
1 4 1.86

2 0 1.5
2 1 1.6
2 2 1.4
2 3 1.55
2 4 1.62

3 0 1.4
3 1 1.35
3 2 1.36
3 3 1.34
3 4 1.3

4 0 1.1
4 1 1.2
4 2 1.15
4 3 1.05
4 4 1.06

第一列是x坐标值,第二列是y坐标,第三列是密度值。 所以这个数据的图需要是 5x5..

的等高线图

现在我使用下面的 gnuplot 脚本来绘制它:

reset

set term png size 2048, 2048
set output "n2d.png"
filename = "n2d.dat"   ## electron density ne (x,y)
set cbrange [-1 : 2] 
set size ratio 1
set palette defined (-1 "black", -0.5 "blue", 0 "white", 1 "red", 1.25 "black")
set pm3d map
splot filename notitle
set ticslevel 0

它自动获取数据数组大小而无需指定,这使得数据是 5x5 还是 128x128 或其他东西变得通用。

我试图生成一个 matplotlib 脚本来执行此操作,但它并不通用,我必须指定数组的大小。剧本是:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np


data = np.loadtxt("n2d.dat", usecols=range(0,3), dtype=np.float32)
datamod = np.transpose( data[:,2].reshape(5,5) ) 
#reshapes the data into a 2D array of 5x5 with all the density values
density = plt.imshow(datamod, cmap='viridis', origin='lower', interpolation='none')
plt.colorbar(density)
plt.savefig("density.png", dpi=300)

python 脚本不具有与 gnuplot 脚本相同的通用性,我必须使用“reshape(5,5)”将数组大小指定为 5x5。

如何使用 matplotlib 实现与 gnuplot 脚本相同的通用性?

python matplotlib gnuplot contourf
1个回答
0
投票

我认为这可以做你想做的事:

import matplotlib
import matplotlib.pyplot as plt
import numpy as np


data = np.loadtxt("n2d.dat", usecols=range(0,3), dtype=np.float32)

nx = len(np.unique(data[:,0]))
ny = len(np.unique(data[:,1]))
assert nx*ny == len(data)

datamod = np.transpose( data[:,2].reshape(nx, ny) ) 

#reshapes the data into a 2D array of 5x5 with all the density values
density = plt.imshow(datamod, cmap='viridis', origin='lower', interpolation='none')
plt.colorbar(density)
plt.savefig("density.png", dpi=300)

注意

assert
语句:它基本上验证了每个 (x, y) 对都是唯一的,即输入数据文件中没有重复的坐标(可能具有冲突的值)。可以说,你可以用一个例外来代替它:

if nx * ny != len(data):
    raise ValueError("non-unique coordinates in the input data")

由于

assert
语句通常被视为一种验证 programmatically 的方法,所以确实不应该发生某些事情。在这里,它用于验证输入数据,这是程序员无法控制的。

使用

unique
和浮点数还有一个棘手的问题。只要数据刚刚被读入,相等的坐标就应该被测试为相等,因为它们的值将按位保持相同的表示,因此唯一的值确实会被唯一地计算。如果不是这种情况,assert 语句很可能会失败。

注意:这种情况也处理非正方形 n 乘 m 数据。如果你知道数据是 n 乘 n,你可以使事情更简单,因为那样你就知道

n = round(np.sqrt(len(data)))
。 (四舍五入可能会隐藏非正方形长度,因此您仍然需要验证
n * n == len(data)
。)

© www.soinside.com 2019 - 2024. All rights reserved.