我有多个函数,我输入一个数组或字典以及一个路径作为参数,该函数将一个图保存到特定路径的路径。matplotlib绘图非常慢
试图保持例如尽可能小,但这里有两个功能:
def valueChartPatterns(dict,path):
seen_values = Counter()
for data in dict.itervalues():
seen_values += Counter(data.values())
seen_values = seen_values.most_common()
seen_values_pct = map(itemgetter(1), tupleCounts2Percents(seen_values))
seen_values_pct = ['{:.2%}'.format(item)for item in seen_values_pct]
plt.figure()
numberchart = plt.bar(range(len(seen_values)), map(itemgetter(1), seen_values), width=0.9,align='center')
plt.xticks(range(len(seen_values)), map(itemgetter(0), seen_values))
plt.title('Values in Pattern Dataset')
plt.xlabel('Values in Data')
plt.ylabel('Occurrences')
plt.tick_params(axis='both', which='major', labelsize=6)
plt.tick_params(axis='both', which='minor', labelsize=6)
plt.tight_layout()
plt.savefig(path)
plt.clf()
def countryChartPatterns(dict,path):
seen_countries = Counter()
for data in dict.itervalues():
seen_countries += Counter(data.keys())
seen_countries = seen_countries.most_common()
seen_countries_percentage = map(itemgetter(1), tupleCounts2Percents(seen_countries))
seen_countries_percentage = ['{:.2%}'.format(item)for item in seen_countries_percentage]
yvals = map(itemgetter(1), seen_countries)
xvals = map(itemgetter(0), seen_countries)
plt.figure()
countrychart = plt.bar(range(len(seen_countries)), yvals, width=0.9,align='center')
plt.xticks(range(len(seen_countries)), xvals)
plt.title('Countries in Pattern Dataset')
plt.xlabel('Countries in Data')
plt.ylabel('Occurrences')
plt.tick_params(axis='both', which='major', labelsize=6)
plt.tick_params(axis='both', which='minor', labelsize=6)
plt.tight_layout()
plt.savefig(path)
plt.clf()
一个很小的例子快译通是,但实际字典包含56000个值:
dict = {"a": {"Germany": 20006.0, "United Kingdom": 20016.571428571428}, "b": {"Chad": 13000.0, "South Africa": 3000000.0},"c":{"Chad": 200061.0, "South Africa": 3000000.0}
}
而且在我的电话:
if __name__ == "__main__":
plt.close('all')
print "Starting pattern charting...\n"
countryChartPatterns(dict,'newPatternCountries.png'))
valueChartPatterns(dict,'newPatternValues.png'))
注意,我加载import matplotlib.pyplot as plt
。
在PyCharm中运行此脚本时,我在控制台中得到了Starting pattern charting...
,但函数花费了超长时间才绘制出来。
我在做什么错?我是否应该使用直方图而不是条形图,因为这应该达到给出国家/值的出现次数的相同目标?我可以以某种方式更改我的GUI后端吗?欢迎任何建议。
我会时刻通过字典中的'for'循环需要多长时间;对我来说这看起来像是让事情变得缓慢的嫌疑犯。除此之外;没有一个工作的例子,我们只能猜测...... – Bart
有没有什么标准的事情可以用'matplotlib'来加快速度?尝试使用小数据集工作得非常好。 –
你确定它是'matplotlib',它很慢吗?因为一个小数据集也简化了预处理。在你真正知道哪个部分很慢之前,不要开始优化!我会使用最简单的所有计时器(或查看Python分析器); '进口时间; T0 =了time.time(); your_code;打印(time.time() - t0')并且在(1)数据的预处理('for'循环和其他所有内容)和(2)绘图部分周围放置这样一个计时器。我很好奇 – Bart