1

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

我想在条形图中绘制的数据来自具有以下 SQL 的 postgres 数据库:

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')  

这导致了这个情节:

在此处输入图像描述

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

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

在此处输入图像描述

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

所以我的问题是:我怎样才能解决一个分布均匀的图(如第一个图)。我错过了什么吗?我在网上搜索了几个小时,但找不到解决问题的提示或解决方案。

我将不胜感激您能提供的任何帮助。

4

1 回答 1

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

于 2012-11-09T09:52:50.577 回答