pythoncsv文件处理软件_-用 Python 做科学计算--CSV文件数据图形化工具

本文介绍了如何使用Python和matplotlib创建一个CSV文件数据图形化工具。该工具包含一个CSV文件加载器,用户可以选择数据列进行绘图,并在多个图表之间切换。通过TraitsUI和matplotlib,实现了数据选择和图表更新功能。
摘要由CSDN通过智能技术生成

# CSV文件数据图形化工具

相关文档: [_设计自己的Trait编辑器_](15)

采用 [_在traitsUI中使用的matplotlib控件_](30) 制作的CSV文件数据绘图工具。

![](https://oss.showapi.com/doc/2125/31/16683a7c-15a8-4bee-827e-a2974b415ca3.png) ![](https://oss.showapi.com/doc/2125/31/253892af-63d6-4693-98be-dc2c6122881f.png)

```

# -*- coding: utf-8 -*-

from matplotlib.figure import Figure

from mpl_figure_editor import MPLFigureEditor

from enthought.traits.ui.api import *

from enthought.traits.api import *

import csv

class DataSource(HasTraits):

"""

数据源,data是一个字典,将字符串映射到列表

names是data中的所有字符串的列表

"""

data = DictStrAny

names = List(Str)

def load_csv(self, filename):

"""

从CSV文件读入数据,更新data和names属性

"""

f = file(filename)

reader = csv.DictReader(f)

self.names = reader.fieldnames

for field in reader.fieldnames:

self.data[field] = []

for line in reader:

for k, v in line.iteritems():

self.data[k].append(float(v))

f.close()

class Graph(HasTraits):

"""

绘图组件,包括左边的数据选择控件和右边的绘图控件

"""

name = Str # 绘图名,显示在标签页标题和绘图标题中

data_source = Instance(DataSource) # 保存数据的数据源

figure = Instance(Figure) # 控制绘图控件的Figure对象

selected_xaxis = Str # X轴所用的数据名

selected_items = List # Y轴所用的数据列表

clear_button = Button(u"清除") # 快速清除Y轴的所有选择的数据

view = View(

HSplit( # HSplit分为左右两个区域,中间有可调节宽度比例的调节手柄

# 左边为一个组

VGroup(

Item("name"), # 绘图名编辑框

Item("clear_button"), # 清除按钮

Heading(u"X轴数据"), # 静态文本

# X轴选择器,用EnumEditor编辑器,即ComboBox控件,控件中的候选数据从

# data_source的names属性得到

Item("selected_xaxis", editor=

EnumEditor(name="object.data_source.names", format_str=u"%s")),

Heading(u"Y轴数据"), # 静态文本

# Y轴选择器,由于Y轴可以多选,因此用CheckBox列表编辑,按两列显示

Item("selected_items", style="custom",

editor=CheckListEditor(name="object.data_source.names",

cols=2, format_str=u"%s")),

show_border = True, # 显示组的边框

scrollable = True, # 组中的控件过多时,采用滚动条

show_labels = False # 组中的所有控件都不显示标签

),

# 右边绘图控件

Item("figure", editor=MPLFigureEditor(), show_label=False, width=600)

)

)

def _name_changed(self):

"""

当绘图名发生变化时,更新绘图的标题

"""

axe = self.figure.axes[0]

axe.set_title(self.name)

self.figure.canvas.draw()

def _clear_button_fired(self):

"""

清除按钮的事件处理

"""

self.selected_items = []

self.update()

def _figure_default(self):

"""

figure属性的缺省值,直接创建一个Figure对象

"""

figure = Figure()

figure.add_axes([0.05, 0.1, 0.9, 0.85]) #添加绘图区域,四周留有边距

return figure

def _selected_items_changed(self):

"""

Y轴数据选择更新

"""

self.update()

def _selected_xaxis_changed(self):

"""

X轴数据选择更新

"""

self.update()

def update(self):

"""

重新绘制所有的曲线

"""

axe = self.figure.axes[0]

axe.clear()

try:

xdata = self.data_source.data[self.selected_xaxis]

except:

return

for field in self.selected_items:

axe.plot(xdata, self.data_source.data[field], label=field)

axe.set_xlabel(self.selected_xaxis)

axe.set_title(self.name)

axe.legend()

self.figure.canvas.draw()

class CSVGrapher(HasTraits):

"""

主界面包括绘图列表,数据源,文件选择器和添加绘图按钮

"""

graph_list = List(Instance(Graph)) # 绘图列表

data_source = Instance(DataSource) # 数据源

csv_file_name = File(filter=[u"*.csv"]) # 文件选择

add_graph_button = Button(u"添加绘图") # 添加绘图按钮

view = View(

# 整个窗口分为上下两个部分

VGroup(

# 上部分横向放置控件,因此用HGroup

HGroup(

# 文件选择控件

Item("csv_file_name", label=u"选择CSV文件", width=400),

# 添加绘图按钮

Item("add_graph_button", show_label=False)

),

# 下部分是绘图列表,采用ListEditor编辑器显示

Item("graph_list", style="custom", show_label=False,

editor=ListEditor(

use_notebook=True, # 是用多标签页格式显示

deletable=True, # 可以删除标签页

dock_style="tab", # 标签dock样式

page_name=".name") # 标题页的文本使用Graph对象的name属性

)

),

resizable = True,

height = 0.8,

width = 0.8,

title = u"CSV数据绘图器"

)

def _csv_file_name_changed(self):

"""

打开新文件时的处理,根据文件创建一个DataSource

"""

self.data_source = DataSource()

self.data_source.load_csv(self.csv_file_name)

del self.graph_list[:]

def _add_graph_button_changed(self):

"""

添加绘图按钮的事件处理

"""

if self.data_source != None:

self.graph_list.append( Graph(data_source = self.data_source) )

if __name__ == "__main__":

csv_grapher = CSVGrapher()

csv_grapher.configure_traits()

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值