ヒストグラムしたい(.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_line
でinterpolate="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
を使って頻度(≠パーセンテージ)をオーバーレイしています。
カテゴリカル変数の度数分布を確認する場合に便利です。
mark
とstack + text
をそれぞれ返すようになっているので、受け取ってから保存する間にプロパティを調整できます。