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-script 内にあります。

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 月) のエントリが 1 つしかないため、棒グラフが年ごとにグループ化されている印象を受けますが、2007 年の場合は毎月値があります。

だから私の質問:バーが均等に広がっているプロットを解決するにはどうすればよいですか(最初のプロットのように)。何か不足していますか?Web を数時間検索しましたが、問題のヒントや解決策が見つかりませんでした。

ご協力いただければ幸いです。

4

1 に答える 1

0

この動作の実際の理由は見つかりませんでしたが、回避策:
SELECT
(to_char(serie、'yyyymm')):: text AS Year、
sum(amount):: neuro :: 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 に答える