ギャラリーの例に従って、matplotlib でグループ化された棒グラフを作成しようとしています。私は以下を使用します:
import matplotlib.pyplot as plt
plt.figure(figsize=(7,7), dpi=300)
xticks = [0.1, 1.1]
groups = [[1.04, 0.96],
[1.69, 4.02]]
group_labels = ["G1", "G2"]
num_items = len(group_labels)
ind = arange(num_items)
width = 0.1
s = plt.subplot(1,1,1)
for num, vals in enumerate(groups):
print "plotting: ", vals
group_len = len(vals)
gene_rects = plt.bar(ind, vals, width,
align="center")
ind = ind + width
num_groups = len(group_labels)
# Make label centered with respect to group of bars
# Is there a less complicated way?
offset = (num_groups / 2.) * width
xticks = arange(num_groups) + offset
s.set_xticks(xticks)
print "xticks: ", xticks
plt.xlim([0 - width, max(xticks) + (num_groups * width)])
s.set_xticklabels(group_labels)
私の質問は次のとおりです。
バーのグループ間のスペースを制御するにはどうすればよいですか? 現在、間隔は大きく、ばかげているように見えます。私はバーを広くしたくないことに注意してください - 私はバーを同じ幅にしたいのですが、互いに近づけたいと思っています。
バーのグループの下にラベルを中央に配置するにはどうすればよいですか? xlabels を適切な場所に配置するためにいくつかの算術計算を考え出そうとしましたが (上記のコードを参照)、まだ少しずれています... プロット ライブラリを使用するのではなく、プロット ライブラリを作成するように感じます。これはどのように修正できますか?(これがデフォルトの動作であるmatplotlibのラッパーまたは組み込みユーティリティはありますか?)
編集: @mlgill に返信: ご回答ありがとうございます。コードは確かにはるかに洗練されていますが、同じ問題、つまり、バーの幅とグループ間の間隔が個別に制御されていないという問題があります。あなたのグラフは正しいように見えますが、バーが広すぎます。Excel グラフのように見えます。バーを細くしたかったのです。
幅とマージンがリンクされるようになったので、試してみると:
margin = 0.60
width = (1.-2.*margin)/num_items
バーは細くなりますが、グループが離れてしまうため、プロットは再び正しく表示されません。
各バーの幅とバー グループ間の間隔の 2 つのパラメーターを取り、コードのように正しくプロットする、グループ化されたバー プロット関数を作成するにはどうすればよいですか?
ユーザーはマージンや幅などの特定の低レベルのレイアウト量を計算する必要があるため、基本的にはまだプロット ライブラリを作成していると思います :)