「Plotly プロットでインド数字システムの表記を使用する」

Using Indian numeral system in Plotly plots

Plotlyは、データの視覚化のための包括的なリソースを提供する多目的なライブラリです。ユーザーのニーズに合わせてチャートをカスタマイズする能力により、多くのアナリストやデータ愛好家のお気に入りとなっています。

最近の使用例では、Plotlyのプロットにインドの数字システムの表記法を取り入れたいと考えました。具体的には、従来の「Millions(百万)」や「Billions(十億)」の表記法を、より文化的に関連する「Lacs(ラク)」や「Crores(クロール)」の表記法に置き換えることを目指しました。Plotlyには直接的にこれを追加するための機能はなかったものの、プロットのプロパティをカスタマイズする方法を見つけました。

Mayur Freelancerによる画像

プロットの作成中、ラインチャート内の「hovertemplate」プロパティでリスト内包表記を活用しました。これにより、入力数値を「Crores(クロール)」、「Lacs(ラク)」、「K(千)」、または単にその数値自体に分類することができます。この分類を実現するために、文字列形式の入力数値の長さという基本的でありながら初等的な性質に頼りました。

例を使ってこれを説明しましょう。30日間の期間にわたる支出に基づいて、あるブランドの売上パフォーマンスをルピー(₹)単位で分析することを目指す仮想的なシナリオのために、ランダムなデータを生成します。

import numpy as npimport pandas as pdimport plotly.graph_objects as gonp.random.seed(66)df = pd.DataFrame(   {     '支出': sorted(np.random.randint(1000000, 5000000, 30)),     '売上': sorted(np.random.randint(1000000, 4000000, 30))   })df.head(3)

生成されたデータは次のようになります:

著者による画像

入力の支出と売上データをソートして、より線形に近いチャートを作成し、より具体的な例を示すために並べ替えたことに注意してください。

次に、支出と売上の数字を、それらの文字列形式の数値の長さに基づいてカテゴリ分けする必要があります。

if len(str(min(df['支出']))) >= 8 or len(str(max(df['支出']))) >= 8:    unit = ' クロール'    df['支出'] = df['支出'].apply(lambda x: round(x/pow(10, 7), 2)) elif (len(str(min(df['支出']))) >= 6 and len(str(min(df['支出']))) < 8) or (len(str(max(df['支出']))) >= 6 and len(str(max(df['支出']))) < 8):    unit = ' ラク'    df['支出'] = df['支出'].apply(lambda x: round(x/pow(10, 5), 2)) elif (len(str(min(df['支出']))) > 3 and len(str(min(df['支出']))) <= 5) or (len(str(max(df['支出']))) > 3 and len(str(max(df['支出']))) <= 5):    unit = ' 千'    df['支出'] = df['支出'].apply(lambda x: round(x/pow(10, 3), 2)) else:    unit = ''

ここでは、支出列の最小値と最大値に特定の条件を設けました。支出列のどちらかの端がこれらの条件を満たす場合、変数「unit」の値が割り当てられます。これらの条件には、支出列を10⁷(クロール)、10⁵(ラク)、または10³(千)で割ることも含まれています。これにより、値がクロール、ラク、または千に変換され、目標を満たす軸の目盛りの設定に役立ちます。

同様に、売上列のためにも単位を導出し、数字をフォーマットしました:

if len(str(min(df['売上']))) >= 8 or len(str(max(df['売上']))) >= 8:    unit2 = ' クロール'    df['売上'] = df['売上'].apply(lambda x: round(x/pow(10, 7), 2))    elif (len(str(min(df['売上']))) >= 6 and len(str(min(df['売上']))) < 8) or (len(str(max(df['売上']))) >= 6 and len(str(max(df['売上']))) < 8):    unit2 = ' ラク'    df['売上'] = df['売上'].apply(lambda x: round(x/pow(10, 5), 2))    elif (len(str(min(df['売上']))) > 3 and len(str(min(df['売上']))) <= 5) or (len(str(max(df['売上']))) > 3 and len(str(max(df['売上']))) <= 5):    unit2 = ' 千'    df['売上'] = df['売上'].apply(lambda x: round(x/pow(10, 3), 2))    else:    unit2 = ''

さて、プロットを作成する時間です:

fig = go.Figure()fig.add_trace(    go.Scatter(        x = df['Spends'],        y = df['Sales'],        mode = 'lines',        hovertemplate = [            '<b>'            + '支出:₹'            + str(spends)            + unit            + '<extra></extra>'            for spends in df['Spends']        ],    ))

「hovertemplate」では、リスト内包表記を使用し、Spends列全体を走査し、数値の前にルピー記号(₹)を付けています。また、前のステップで導出した単位変数を追加しています。

最後に、プロットの目盛りに接頭辞と接尾辞を追加して軸を整形します。ここでは、数字を「クロール」「ラック」「サウザンド」で除算することが適切な目盛りを取得するために重要な役割を果たします。

fig.update_xaxes(title = '支出', tickprefix = '₹', ticksuffix = unit)fig.update_yaxes(title = '売上', tickprefix = '₹', ticksuffix = unit2)fig.show()

これにより、次のプロットが表示されます:

Image by Author

完全なコード

import pandas as pdimport plotly.graph_objects as goimport numpy as np# Set a seed for reproducibilitynp.random.seed(66)# Create a DataFrame with random data for 'Spends' and 'Sales'df = pd.DataFrame(    {         'Spends': sorted(np.random.randint(1000000, 5000000, 30)),         'Sales': sorted(np.random.randint(1000000, 4000000, 30))    })# Determine the appropriate unit and divider for 'Spends' based on its rangeif len(str(min(df['Spends']))) >= 8 or len(str(max(df['Spends']))) >= 8:    unit = ' クロール'    df['Spends'] = df['Spends'].apply(lambda x: round(x/pow(10, 7), 2))    elif (len(str(min(df['Spends']))) >= 6 and len(str(min(df['Spends']))) < 8) or (len(str(max(df['Spends']))) >= 6 and len(str(max(df['Spends']))) < 8):    unit = ' ラックス'    df['Spends'] = df['Spends'].apply(lambda x: round(x/pow(10, 5), 2))    elif (len(str(min(df['Spends']))) > 3 and len(str(min(df['Spends']))) <= 5) or (len(str(max(df['Spends']))) > 3 and len(str(max(df['Spends']))) <= 5):    unit = ' K'    df['Spends'] = df['Spends'].apply(lambda x: round(x/pow(10, 3), 2))    else:    unit = ''# Determine the appropriate unit and divider for 'Sales' based on its rangeif len(str(min(df['Sales']))) >= 8 or len(str(max(df['Sales']))) >= 8:    unit2 = ' クロール'    df['Sales'] = df['Sales'].apply(lambda x: round(x/pow(10, 7), 2))    elif (len(str(min(df['Sales']))) >= 6 and len(str(min(df['Sales']))) < 8) or (len(str(max(df['Sales']))) >= 6 and len(str(max(df['Sales']))) < 8):    unit2 = ' ラックス'    df['Sales'] = df['Sales'].apply(lambda x: round(x/pow(10, 5), 2))    elif (len(str(min(df['Sales']))) > 3 and len(str(min(df['Sales']))) <= 5) or (len(str(max(df['Sales']))) > 3 and len(str(max(df['Sales']))) <= 5):    unit2 = ' K'    df['Sales'] = df['Sales'].apply(lambda x: round(x/pow(10, 3), 2))    else:    unit2 = ''# Scatter Chart with mode = 'lines'を作成するfig = go.Figure()fig.add_trace(    go.Scatter(        x = df['Spends'],        y = df['Sales'],        mode = 'lines',        hovertemplate = [            '<b>'            + '支出:₹'            + str(spends)            + unit            + '<extra></extra>'            for spends in df['Spends']        ],    ))# X軸とY軸にラベル、接頭辞、接尾辞を追加して更新するfig.update_xaxes(title = '支出', tickprefix = '₹', ticksuffix = unit)fig.update_yaxes(title = '売上', tickprefix = '₹', ticksuffix = unit2)# プロットを表示するfig.show()

したがって、このアプローチにより、Plotlyプロットにインドの数字システムの微妙なニュアンスを統合することができます。千、ラック、およびクロールの表記法の力を活用し、視覚化に文化的なコンテキストを加えています。さらに条件を探求することで、より多様な表記法の配列を作り出し、データ視覚化の物語を豊かにすることができます。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more