ヒストグラムしたい(.mark_bar

1base = alt.Chart(data).encode(
2    alt.X("X軸").bin(),
3    alt.Y("count()"),
4)
5
6base.mark_bar()
7base.mark_area(interpolate="step")
8base.mark_line(interpolate="step")

ヒストグラムは.mark_barを使って作成します。 また、同じような見た目の図は.mark_area.mark_lineinterpolate="step"のオプションを使って作成できます。

タイトルしたい

1# Method Syntax (v5)
2alt.Chart(data).mark_bar().encode(
3    alt.X("adc:Q").bin().title("X軸のタイトル"),
4    alt.Y("count()").title("Y軸のタイトル"),
5).properties(
6    title="グラフのタイトル",
7)
1# Attribute Syntax (v4 & v5)
2alt.Chart(data).mark_bar().encode(
3    alt.X("adc:Q", bin=True, axis=alt.Axis(title="X軸のタイトル")),
4    alt.Y("count()", axis=alt.Axis(title="Y軸のタイトル")),
5).properties(
6    title="グラフのタイトル",
7)

ヒストグラムは.mark_barを使って作成します。 上記サンプルは、テスト実験で測定したADC値のヒストグラムを作成する場合を想定しています。 X軸のADC値は連続量なのでage:Q、Y軸はその値の出現回数にしたいのでcount()を指定しています。

注釈

.encodeの中身の書き方はさまざまあり、より短縮した書き方もあります。 ただし、未来の自分が困らないために、X軸・Y軸などのタイトルはつけておくとよいと思います。

Altair v5では、新しく導入されたMethod Syntaxのおかげでかなり直感的に指定できるようになりました。

ヒント

あらかじめPandasを使って、それぞれのADC値の出現回数を計算しておいてもよいです。 その場合、X軸とY軸にそれぞれカラム名を指定した棒グラフとして作成します。

1data = read_csvなどを使って読み込んだpd.DataFrame
2data["entry"] = 1
3grouped = data.groupby(["adc"])["entry"].sum().reset_index()
4
5alt.Chart(grouped).mark_bar().encode(
6    alt.X("adc:Q").bin(),
7    alt.Y("entry:Q"),
8)

面積でノーマライズしたい

1data_sum = data.groupby("age")["response"].sum().reset_index()
2data_merged = pd.merge(data, data_sum, on="age")
3data_merged["normalized"] = data_merged["response_x"] / data_merged["response_y"]
4data_merged

測定回数や回答数が異なる複数のヒストグラムを比較したい場合、 その面積(=ヒストグラムのエントリー数)でノーマライズして比べる必要があります。 ただし、AltairではできないのでPandasでやります。

割合したい

1alt.Chart(data).mark_bar().encode(
2    alt.X("age:O").title("年代"),
3    alt.Y("count()").stack("normalize"),
4    alt.Color("gender").title("性別"),
5).properties(
6    title="グラフのタイトル",
7)

割合グラフにする場合は、該当する軸を.stack("normalize")します。

積み上げたくない

1opacity = 0.5
2alt.Chart(data).mark_bar(opacity=opacity).encode(
3    alt.X("age:O").title("年代"),
4    alt.Y("count()").stack(None),
5    alt.Color("gender").title("性別"),
6).properties(
7    title="グラフのタイトル",
8)

グラフを積み上げたくない場合は、該当する軸を.stack(None)します。 このときグラフの色の透過度(opacity)を設定するとよいです。

よく使うやつ

 1def hbar(data: pd.DataFrame, x: str, color: str, title: str, y: str="count()"):
 2    color = f"{color}:N"
 3    base = alt.Chart(data).encode(
 4        alt.X(x),
 5        alt.Y(y),
 6    ).properties(
 7        title=title,
 8    )
 9
10    opacity = 0.5
11    mark = base.mark_bar(tooltip=True, opacity=opacity).encode(
12        alt.Y(y),
13        alt.Color(color)
14    )
15
16    stack = base.mark_bar(tooltip=True, opacity=opacity).encode(
17        alt.Y(y).stack("normalize"),
18        alt.Color(color),
19    )
20
21    text = base.mark_text(dy=10).encode(
22        alt.Y(y).stack("normalize"),
23        alt.Text(y),
24        alt.Color(color)
25    )
26
27    return mark | stack + text

棒グラフとその割合の図を一度に作成する関数です。 割合にはmark_textを使って頻度(≠パーセンテージ)をオーバーレイしています。 カテゴリカル変数の度数分布を確認する場合に便利です。

markstack + textをそれぞれ返すようになっているので、受け取ってから保存する間にプロパティを調整できます。