見出し画像

Google ColaboratoryでPythonを始める-15/Altairで動的グラフの作成-2

こんにちはロック204チャンネルです。
今回は「Google ColaboratoryでPythonを始める 15
Altairで動的グラフの作成 2」をお送りします。

最初に今回使用するデータの取り込みをおこないます。
前回同様、irisのデータを使用しますので、このプログラムを実行してください。


今回、各列の項目を使っていろいろ操作するので、このままであれば空白が項目名の中に混じっているのでエラーとなってきます。
そこで、項目名をこのスライドのように変更して使用して行きたいと思います。

#データの取り込み「iris」
from sklearn.datasets import load_iris
import pandas as pd
iris = load_iris()
df = pd.DataFrame(data = iris.data, columns = iris.feature_names)
df['surui'] = iris.target
su_name = {
    0:'setosa',
    1:'versicolor',
    2:'virginica'
}
df['su_name'] = df['surui'].map(su_name)
df


今回は図グラフをHTML形式で保存するためのモジュールもインストールします。
2行のようにpip install命令でaltair_saverをインストールしてください。

 #列名の変更 
df.columns=["sepal_length","sepal_width",
            "petal_length","petal_width","surui","su_name"]
df

それでは取り込んだデータを使用してヒストグラムを作成してみたいと思います。
また作成したグラフを保存するために3行のように「from altair_saver import save」の命令を最初に実行します。
ヒストグラムは基本的に棒グラフですので、6行のようにmark_bar()関数を使用します。
そして10行のように、bin(階級)=alt.Din(step=0.5,extent=[3.5,8.5]))のように設定します。
Stepは階級の幅0.5、extentは表示範囲を示しています。
このように設定すると右上のようなヒストグラムを描くことができます。

そして描いた図形を保存するには、22行のようにsave命令を使って保存します。
カッコの中は保存するチャートの名前、次に保存場所をアドレスで設定します。
それでは実行結果を次のスライドで見ていきましょう。

ヒストグラムの作成と保存


複数の項目がデータベースにある場合に、特定の項目を表示する方法について説明します。
この機能はtransform_filter()で表示することができます。
6行のように、条件式として「alt.datum.su_name(項目名)==“setosa”」と書けば”setosa”のみが表示されます。

 #ヒストグラムと図の保存 import altair as alt
from altair_saver import save
altair_chart = (
    alt.Chart(data=df)
    .mark_bar()
    .encode(
        x=alt.X(
            "sepal_length",
            bin=alt.Bin(step=0.5,extent=[3.5,8.5])),
            #階級(bin)を設定する step:階級の幅、extent:表示区間
        y=alt.Y(
            "sepal_width",
            scale=alt.Scale(domain=[0, 5]),  # 軸の値の範囲
            ),
        color=alt.Color("su_name") #色分け
    )
    .properties(width=500, height=350, title="ヒストグラム")
)
altair_chart
#作成したグラフのHTML保存
save(altair_chart, "/content/saved_chart.html", inline=False)


次に条件で色分けして表示するプログラムについて見て行きましょう。
この前半部分については変更ありません。

 #ヒストグラム・データ抽出 import altair as alt
altair_chart = (
    alt.Chart(data=df)
     #特定の項目を抽出する     .transform_filter(alt.datum.su_name=="setosa")
    .mark_bar()
    .encode(
        x=alt.X(
            "sepal_length",
            bin=alt.Bin(step=0.5,extent=[3.5,8.5])),
            #階級(bin)を設定する step:階級の幅、extent:表示区間
        y=alt.Y(
            "sepal_width",
            scale=alt.Scale(domain=[0, 5]),  # 軸の値の範囲
            ),
        color=alt.Color("su_name") #色分け
    )
    .properties(width=500, height=350, title="ヒストグラム")
)
altair_chart

色分けして表示するには、color属性を設定して行きます。
Color=alt.conditionと書き
パラメーターとしてpredicate=alt.datum.sepal_length>=5のように条件式を書きます。
Sepal_lengthが5以上かという条件式です。
19行では、この条件文が真である場合に色属性をスチールブルーに設定します。
20行では、条件式が偽の場合で、グレーに色付けされます。


こちらに表示結果を表します。
x軸の五以上がスチールブルーで、これより小さい場合がグレーになっています。

 #ヒストグラム・ 条件で色分けする
import altair as alt
altair_chart = (
    alt.Chart(data=df)
     #特定の項目を抽出する     .transform_filter(alt.datum.su_name=="setosa")
    .mark_bar()
    .encode(
        x=alt.X(
            "sepal_length",
            bin=alt.Bin(step=0.5,extent=[3.5,8.5])),
            #階級(bin)を設定する step:階級の幅、extent:表示区間
        y=alt.Y(
            "sepal_width",
            scale=alt.Scale(domain=[0, 5]),  # 軸の値の範囲
            ),
        color=alt.condition(
            predicate=alt.datum.sepal_length >= 5, # if 文を挿入します。
            if_true=alt.value("steelblue"), # 5以上のレコードは青色
            if_false=alt.value("gray"), # それ以下は灰色
        ),
        tooltip=[
            alt.Tooltip(field="sepal_length"),
        ],
    )
    .properties(width=500, height=350, title="ヒストグラム")
)
altair_chart


次にスライダーを使用したプログラム例を見て行きましょう。
スライダーは右上の図のグラフの下の部分にある ハンドルを持った横長のバーを操作することによって値を選択することができます。
スライダーを設定するには、4行のようにスライダー名=alt.binding_range(と書き括弧の中に、最小値、最大値、刻み値、スライダーのラベルをいれていきます。
そしてscore_selectionとして=alt.selectionと書き括弧の中に
Type=“single”
Fields、これは項目の名前、今回は”sepal_length”を項目とします。
次にbindは前の行で設定したscore_sliderを設定します。
最後は、initで初期値を設定します。

27行はスライダーで選ばれた値を参照として色分けするプログラムとなっています。
「>=」の後のscore_selection.sepal_lengthはスライダーで動かされたときに選択する値となります。

そしてプログラムの最後でadd_selection(score_selection)でスライダーを追加します。
それでは実行結果を見て行きましょう。

スライダーの使用


こちらはドロップダウンリストの使用方法になります。
プログラムの最初に
8行のように「subject_dropdown=alt.binding_slection()」としてリストに表示する文字列を設定します。
9行目は、「subject_selection=alt.selection_single()」としてカッコ内に項目名、bind=前の行で設定した名前、ラベル名、初期値を入れて行きます。

 #ヒストグラム・ スライダーの使用
import altair as alt
#スライダーの設定(最小値。最大値、刻み値、スライダーのラベル)
score_slider = alt.binding_range(min=0, max=8, step=0.5, name="length")
score_selection = alt.selection(
    type="single" ,
    fields=["sepal_length"], #対象とする項目
    bind=score_slider, #前の行で設定したscore_sliderを設定
    init={"sepal_length":0} #スライダーの初期値を0とする
)

altair_chart = (
    alt.Chart(data=df)
     #特定の項目を抽出する     .transform_filter(alt.datum.su_name=="setosa")
    .mark_bar()
    .encode(
        x=alt.X(
            "sepal_length",
            bin=alt.Bin(step=0.5,extent=[3.5,8.5])),
            #階級(bin)を設定する step:階級の幅、extent:表示区間
        y=alt.Y(
            "sepal_width",
            scale=alt.Scale(domain=[0, 5]),  # 軸の値の範囲
            ),
        color=alt.condition(
            predicate=alt.datum.sepal_length >= score_selection.sepal_length, #
            if_true=alt.value("steelblue"), # 5以上のレコードは青色
            if_false=alt.value("gray"), # それ以下は灰色
        ),
        tooltip=[
            alt.Tooltip(field="sepal_length"),
        ],
    )
    .properties(width=500, height=350, title="ヒストグラム")
    .add_selection(score_selection) #スライダーを追加
)
altair_chart

こちらのコードは変更ありません。

プログラムの終わりに
39行でadd_selection()でドロップダウンリストを追加します。
そして40行のtransform_filterを使用して、ドロップダウンリストで選ばれた値を使ってフィルターをかけその項目だけを表示するようにします。
それでは実行結果を見て行きましょう。

ドロップダウンリストの使用-4

 #ヒストグラム・ ドロップダウンリストの使用
import altair as alt
score_slider = alt.binding_range(min=0, max=8, step=0.5, name="length")
score_selection = alt.selection(
    type="single" ,fields=["sepal_length"], bind=score_slider, init={"sepal_length":0}
)

subject_dropdown = alt.binding_select(options=["setosa", "versicolor", "virginica"])
subject_selection = alt.selection_single(
    fields=["su_name"], bind=subject_dropdown, name="subject", init={"suname": "setosa"}
)

altair_chart = (
    alt.Chart(data=df)
     #特定の項目を抽出する     #transform_filter(alt.datum.su_name=="setosa")
    .mark_bar()
    .encode(
        x=alt.X(
            "sepal_length",
            bin=alt.Bin(step=0.5,extent=[3.5,8.5])),
            #階級(bin)を設定する step:階級の幅、extent:表示区間
        y=alt.Y(
            "sepal_width",
            scale=alt.Scale(domain=[0, 5]),  # 軸の値の範囲
            ),
        color=alt.condition(
            predicate=alt.datum.sepal_length >= score_selection.sepal_length, #
            if_true=alt.value("steelblue"), # 5以上のレコードは青色
            if_false=alt.value("gray"), # それ以下は灰色
        ),
        tooltip=[
            alt.Tooltip(field="sepal_length"),
        ],
    )
    .properties(width=500, height=350, title="ヒストグラム")
    .add_selection(score_selection)

    .add_selection(subject_selection)
    .transform_filter(subject_selection)
)
altair_chart



この記事が気に入ったらサポートをしてみませんか?