matplotlib barchart:如何在postgres-generate_series中均匀地展开条形图?

时间:2012-11-08 10:37:55

标签: postgresql matplotlib bar-chart psycopg2

我正在使用matplotlib创建一个条形图,并使用psycopg2连接到postgres数据库。

我想在条形图中绘制的数据来自postgres数据库,其中包含以下SQL:

SELECT  
(to_char(serie,'yyyy'))::text::int AS Year,  
sum(amount)::numeric::int AS eintraege   
FROM ( SELECT...) ... ;

sql中的“serie”代表2006年到2012年的generate_series。这段代码在我的python脚本中,用于绘制结果:

plt.bar(year, count, align='center')  
fig.autofmt_xdate()  
plt.xticks(year, (year))  
plt.xlabel('year')  
plt.ylabel('V1M0')  

这导致了这个情节:

enter image description here

到目前为止,我得到了我期望得到的东西:-)

但是如果我在上面的sql中扩展我的generate_series(to_char(serie,'yyyy'),那么它不仅给了我几年而且给了几个月((to_char(serie,'yyyymm'),情节看起来有些奇怪:

enter image description here

我得到的印象是酒吧按年份分组,因为我在我的数据库中只有2006年(2006年12月)的一个条目,但2007年每个月都有一个值。

所以我的问题是:如何使用均匀分布的条形图来解析图形(如第一个图中所示)。我错过了什么吗?我在网上搜索了几个小时,但我找不到我的问题的提示或解决方案。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:0)

我没有找到这种行为的实际原因而是一种解决方法:
    SELECT
    (to_char(serie,'yyyymm')):: text AS Year,
    sum(amount):: numeric :: int AS eintraege
    FROM(SELECT ...)...;
不要将generate_series强制转换为整数,而是将列格式化为字符串。然后进行绘图,计算“plt.xticks”

中字符串的长度
plt.bar(range(len(count)), count, align='center', label='Anzahl an erstellten Objekten')
fig.autofmt_xdate()  
plt.xticks(range(len(count)), (year)) 
plt.xlabel('year')  
plt.ylabel('V1M0')  

现在情节看起来不错(不管轴标记,以后可以改变) http://geospatialview.de/wp-content/uploads/2012/11/Histogramm_komisch_geloest.png