使用来自多个txt文件的数据创建散点图

时间:2019-01-24 14:35:41

标签: python python-3.x

我正在尝试从多个txt文件创建散点图。所有文件都具有相同的结构:两列以数据和“逗号”作为分隔符:
54.1,12
65.7,11
122.2,18

对于少量文件,我有以下代码:

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

# Create data
g1=np.loadtxt('214.txt',delimiter=',', unpack=True)
g2=np.loadtxt('228.txt',delimiter=',', unpack=True)
g3=np.loadtxt('491.txt',delimiter=',', unpack=True)
g4=np.loadtxt('647.txt',delimiter=',', unpack=True)
data = (g1, g2, g3,g4)
colors = ("red", "green", "blue", "black")
groups = ("214", "228", "491", "647") 

# Create plot
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

for data, color, group in zip(data, colors, groups):
    y, x = data
    ax.scatter(x, y, alpha=0.8, c=color, edgecolors='none', s=30, label=group)

#Plot settings 
plt.title('Matplot scatter plot')
plt.legend(loc=4)
axes = plt.gca()
axes.set_xlim([2,30])
axes.set_ylim([0,3000])
plt.gca().invert_yaxis()
plt.show()

如果每次读取的文件数都不相同,请建议如何修改它以读取文件夹中的多个(最多50-100个)txt文件?

3 个答案:

答案 0 :(得分:0)

我将搜索当前目录中的所有文件,并确定要从中提取数据的文件。可以使用类似的方法完成:

from os import listdir, path

files = [f for f in listdir('.') if path.isfile(f)]
file_names = [file for file in files if file.startswith('file_name_identifer')]

这将为您提供一个文件名列表,其中包含要提取的数据,然后可以在for循环中逐个加载它们。使用与您上面使用的类似的加载技术:

data = []
for file in file_names:
    data.append(np.loadtxt('file', delimiter=',', unpack=True))

您也可以将其展平为生成器表达式:

data = [np.loadtxt('file', delimiter=',', unpack=True) for file in file_names]

如果文件不是以可用于识别它们的文件开头,则可以简单地进行其他检查(将if file.startswith('file_name_indentifer')更改为其他文件,例如可以检查它们是否是.txt文件) :if file.endswith('.txt')

答案 1 :(得分:0)

您可以使用this post

中描述的方法获取目录中所有文件的列表。

然后执行以下操作:

data = []
for file in filenames:
  data.append(np.loadtxt(file, delimiter=‘,’, unpack = True

#And do everything else you did with data

尽管如果您的数据集更大,则系统内存中的可用空间我会考虑在您读取文件时添加数据点以进行绘图

data = []
colors = [“red”,”green”,”blue”,”balck”]
for i, file in enumerate(filenames):
  data = np.loadtxt(file, delimiter=‘,’,unpack=True)
  group = file.split(‘.’)[0]
  color = colors[i%len(colors)]
  ax.scatter(data[0], data[1], alpha=0.8, c=color, edgecolors=‘none’, s=30, label=group)

P.S。我在移动设备上书写时引号输入错误(双引号和单引号)

答案 2 :(得分:0)

感谢您的帮助。这是对我有用的东西:

import numpy as np
import matplotlib.pyplot as plt
from os import listdir, path
import logging, sys
import random

data = []
#Get files with extension ".txt")
files = [f for f in listdir('.') if path.isfile(f)]
file_names = [file for file in files if file.endswith('.txt')]

fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)

# Create plot
for file in file_names:
    data=np.loadtxt(file, delimiter=",", unpack = True)
    color = ["#"+''.join([random.choice('0123456789ABCDEF')for j in range(6)])]
    ax.scatter(data[1], data[0], alpha=0.8, c=color, edgecolors="none", s=30, label=file)

#Plot settings 
plt.title('Matplot scatter plot')
plt.legend(loc=4)
axes = plt.gca()
plt.gca().invert_yaxis()
plt.show()