python - 绘制目录中的所有数据文件

标签 python numpy matplotlib

我试图在 python 的目录中绘制我所有的数据文件,然后保存生成的图。我尝试编写高效的 p​​ython 代码(不幸的是):目前只对绘制数据感兴趣。

我是 python 的新手,我的目标是在我的论文中组织图表。

所以使用下面的代码,这就是我想要做的:

  1. 我用 glob 列出所有 .dat 文件
  2. 我用文件名填充一个数组
  3. 我遍历这个文件名数组和plot_surface每个数据文件

我试图绘制的数据是 here

向我吐出的错误是:

错误

  File "/home/dnaneet/Research/test_collection/dftdata/profile2.py", line 59, in <module>
    plot(x, y, z)
  File "/usr/lib/pymodules/python2.7/matplotlib/pyplot.py", line 2286, in plot
    ret = ax.plot(*args, **kwargs)
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 3783, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 317, in _grab_next_args
    for seg in self._plot_args(remaining, kwargs):
  File "/usr/lib/pymodules/python2.7/matplotlib/axes.py", line 278, in _plot_args
    raise ValueError, 'third arg must be a format string'
ValueError: third arg must be a format string

Python代码

import os
import glob
import sys
import subprocess
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

from numpy import *
from numpy.random import rand
from pylab import pcolor, show, colorbar, xticks, yticks
from pylab import *

print 'Listing all profile/dat files'
profilefilelist = glob.glob('*profile*.dat')
raw_input('Press ENTER to continue...')
print profilefilelist


for i in profilefilelist:
  DATA = i
  def get_data(fname=DATA):
    '''Read 2d array of z coordinates from file. Convert to float values
    and wrap in a numpy array.'''
    with open(fname) as f:
        data = [map(float, line.split()) for line in f]
    return np.array(data)
    def plot(x, y, z):

        fig = plt.figure()
        ax = fig.gca(projection='3d')
        ax.plot_surface(x, y, z, rstride=5, cstride=5,cmap="binary",linewidth=0.1)
        ax.set_zlim3d(0.0,4.0)  
        ax.set_xlabel('X',fontsize=16,fontweight="bold")
        ax.set_ylabel('Y',fontsize=16,fontweight="bold")
        ax.set_zlabel('h(X,T)',fontsize=16,fontweight="bold")
        savefig(os.getcwd()+DATA+'.pdf',figsize=(5,5),dpi=600)
        savefig(os.getcwd()+DATA+'.pdf',figsize=(5,5),dpi=600)




if __name__ == '__main__':
    z = get_data()
    x = range(z.shape[0])
    y = range(z.shape[1])
    x, y = np.meshgrid(x, y)
    plot(x, y, z)

问题

这是因为我的缩进不当还是这里发生了更险恶的事情?我应该怎么做才能纠正这些错误?

我不太了解 python,并且一直在尝试远离 mathematica(因为我将毕业并且再也买不起世界上的 mathematica 或 matlab)。

SE 上提供的先前代码:

HERE

修改后的代码(基于答案)

import os
import glob
import sys
import subprocess
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

from numpy import *
from numpy.random import rand
from pylab import pcolor, show, colorbar, xticks, yticks
from pylab import *

print 'Listing all profile/dat files'
profilefilelist = glob.glob('*profile*.dat')
raw_input('Press ENTER to continue...')
print profilefilelist
DATA=profilefilelist


for i in DATA:
    def get_data(fname=i):
        '''Read 2d array of z coordinates from file. Convert to float values
        and wrap in a numpy array.'''
        with open(fname) as f:
            data = [map(float, line.split()) for line in f]
            return np.array(data)
for i in DATA:    
    def my_plot(x, y, z):
        fig = plt.figure()
        ax = fig.gca(projection='3d')
        ax.plot_surface(x, y, z, rstride=5, cstride=5,cmap="binary",linewidth=0.1)
        ax.set_zlim3d(0.0,4.0)  
        ax.set_xlabel('X',fontsize=16,fontweight="bold")
        ax.set_ylabel('Y',fontsize=16,fontweight="bold")
        ax.set_zlabel('h(X,T)',fontsize=16,fontweight="bold")
        plt.show()
#        savefig(os.getcwd()+DATA+'.pdf',figsize=(5,5),dpi=600)
#        savefig(os.getcwd()+DATA+'.pdf',figsize=(5,5),dpi=600)    



if __name__ == '__main__':
            z = get_data()
            x = range(z.shape[0])
            y = range(z.shape[1])
            x, y = np.meshgrid(x, y)
            my_plot(x, y, z)

最佳答案

一些清理建议(你的任务很简单,我认为有一些不必要的操作):

  • 不要迭代列表的索引,而是迭代列表本身;
  • 摆脱样板代码(打印、raw_input 仅用于确认等)
  • 利用数组创建例程。
  • 不要创建只在一个地方调用的函数。
  • 避免多次导入或 from module import *,因为它已经导致名称冲突。

这是您程序的修改版本,我相信它可以达到相同的结果。这不是您问题的解决方案,而是一系列小改进(或者我认为是改进的东西):

import os
import glob
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

for fname in glob.glob('*profile*.dat'):

    z = numpy.loadtxt(fname)

    x,y = np.meshgrid(range(z.shape[0]), range(z.shape[1]))

    fig = plt.figure()

    ax = fig.gca(projection='3d')
    ax.plot_surface(x, y, z, rstride=5, cstride=5,cmap="binary",linewidth=0.1)
    ax.set_zlim3d(0.0,4.0)

    ax.set_xlabel('X',fontsize=16,fontweight="bold")
    ax.set_ylabel('Y',fontsize=16,fontweight="bold")
    ax.set_zlabel('h(X,T)',fontsize=16,fontweight="bold")
    plt.savefig(os.getcwd()+fname+'.pdf',figsize=(5,5),dpi=600)
    plt.savefig(os.getcwd()+fname+'.pdf',figsize=(5,5),dpi=600)

您可以选择在最后两行中使用:

plt.savefig(os.path.join(os.getcwd, "%s.pdf" % fname), figsize=(5,5), dpi=600)

关于python - 绘制目录中的所有数据文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16066273/

相关文章:

python - 同一个图中的多个 matplotlib 图 + 到 pdf-Python

python - Fabric + django异步提示输入sudo密码

python - 将列的值与大小递减的数组(或系列)进行比较

python - 我将一个球体的 matplotlib 图嵌入到 Tkinter 中,但无法再围绕它运行!

python - 如何在 matplotlib 中以不同颜色呈现 LaTeX 字符串的子字符串?

python - 如何在列表列表中查找具有最大值的列表(其中嵌套列表包含字符串和数字)?

python - 如何在elasticsearch中存钱

python - 创建矩阵的最快方法,其中列是彼此的乘积

Python:如何优化函数参数?

python - Matplotlib 3d 散点动画 - 如何正确更新