我正在开发一个程序来显示3d数据的横截面。数据以x,y,z1,z2,z3等格式存储在一个简单的文本csv文件中。我取一个起点和终点并浏览数据集(~110,000行),在这些数据集之间创建一系列点两个位置,并将它们转储到一个数组中。这很好,而且相当快(大约需要0.3秒)。为了显示这一行,我一直在创建一个matplotlib堆积条形图。但是,程序的总运行时间约为5.5秒。我把它的大部分(价值3秒)缩小到下面的代码 'values'是一个数组,其中包含x,y和z值以及一个前导标识符,该标识符在此部分代码中未使用。第一个plt.bar绘制条形截面,第二个用于创建-2000的任意平面。为了生成一个连续观察的部分,我使用每个零条之间的间隔。
import matplotlib.pyplot as plt
for values in crossSection:
prevNum = None
layerColour = None
if values != None:
for i in range(3, len(values)):
if values[i] != 'n':
num = float(values[i].strip())
if prevNum != None:
plt.bar(spacing, prevNum-num, width=interval, \
bottom=num, color=layerColour, \
edgecolor=None, linewidth=0)
prevNum = num
layerColour = layerParams[i].strip()
if prevNum != None:
plt.bar(spacing, prevNum+2000, width=interval, bottom=-2000, \
color=layerColour, linewidth=0)
spacing += interval
我确信有一种更有效的方法可以做到这一点,但我是Matplotlib的新手并且仍然不熟悉其功能。代码中时间的另一个主要用途是:
plt.savefig('output.png')
这需要大约一秒钟,但我认为这是预期保存文件,我无法做任何事情。
通过更好地使用plt.bar()或不同的Matplotlib函数,是否有更快的方法来生成相同的输出(堆积条形图或看起来像一个)?
修改 的 我忘了在原帖中提到我使用的是Python 3.2.3和Matplotlib 1.2.0
答案 0 :(得分:2)
将此留在这里以防有人遇到同样的问题...
虽然与使用bar()
不完全相同,但使用足够大的数据集(足够大以至于使用bar()
需要几秒钟),结果与stackplot()
无法区分。如果我使用tcaswell给出的方法将数据分层,并将其输入stackplot()
,则会在0.2秒内创建图表,而不是3秒。
修改的
tcaswell提供的代码将数据转换为图层:
accum_values = []
for values in crosssection:
accum_values.append([float(v.strip()) for v iv values[3:]])
accum_values = np.vstack(accum_values).T
layer_params = [l.strip() for l in layerParams]
bottom = numpy.zeros(accum_values[0].shape)
答案 1 :(得分:1)
看起来您正在绘制每个条形图,您可以将序列传递到bar
(请参阅此example)
我认为:
accum_values = []
for values in crosssection:
accum_values.append([float(v.strip()) for v iv values[3:]])
accum_values = np.vstack(accum_values).T
layer_params = [l.strip() for l in layerParams]
bottom = numpy.zeros(accum_values[0].shape)
ax = plt.gca()
spacing = interval*numpy.arange(len(accum_values[0]))
for data,color is zip(accum_values,layer_params):
ax.bar(spacing,data,bottom=bottom,color=color,linewidth=0,width=interval)
bottom += data
会更快(因为每次调用bar都会创建一个BarContainer
,我怀疑你的问题来源是你为每个栏创建一个,而不是每个层都有一个。)
我真的不明白你在底部下面有顶部的杆子做了什么,所以我没有尝试实现它,所以你必须适应这一点。