「Storytelling with Data」によると、データの視覚化をすぐに改善するためのMatplotlibのヒント

Tips for improving data visualization with Matplotlib according to 'Storytelling with Data'.

Matplotlibを使用してCole Nussbaumer Knaflic氏の書籍から学んだことを再現する

データを効果的に伝えることは、データサイエンティストやデータアナリストに限らず、データを扱うすべての人にとって重要なスキルです。

このトピックについての私のお気に入りの本の1つは、Cole Nussbaumer Knaflic氏の「Storytelling with Data」です。実用的な例がたくさん含まれており、データビジュアライゼーションの改善方法を説明しています。

Storytelling with Data: A Data Visualization Guide for Business Professionals

Storytelling with Data: A Data Visualization Guide for Business Professionals [Nussbaumer Knaflic, Cole] on Amazon.com…

www.amazon.com

私の意見では、この本の唯一の残念な点は、その例がMicrosoft Excelを使用して作成されていることです。

Excelでデータの視覚化を作るエンジニアを知っている人は手を挙げてください-ええ、私も知りません。

「あなたがエンジニアであっても、あなたのグラフを理解するためにエンジニアリングの学位を持つ人が必要なわけではありません。」-Cole Nussbaumer Knaflic氏の「Storytelling with Data」より

それが、この記事がNussbaumer Knaflic氏の「Storytelling with Data」を読んで以来、私が最も使用したMatplotlibのコードスニペットをカバーする理由です。

import matplotlib.pyplot as plt

この記事では、MatplotlibおよびSeabornを使用したデータビジュアライゼーションの基本を既に知っていることを前提としています。つまり、バープロット、ラインプロット、散布図の作成、カラーパレットの変更、基本的なラベルの追加などを行う方法を知っていることを前提としています。また、どのタイプのグラフを使用するかを認識していると仮定しています。

Matplotlibの基礎をカバーする代わりに、この記事では次のような一般的には知られていないトリックに焦点を当てています。

  • Matplotlibプロットの上部と右部の境界を削除する方法
  • Matplotlibプロットから目盛りを削除する方法
  • Matplotlibプロットで個々のバーの色をカスタマイズする方法
  • Matplotlibプロットでx軸とy軸の色を変更する方法
  • Matplotlibプロットにテキスト注釈を追加する方法
  • Matplotlibプロットにバーチャートの値を追加する方法
  • Matplotlib注釈でテキスト全体または一部を太字にする方法
  • Matplotlib注釈でテキストの色を変更する方法

まずは簡単な例から始めましょう。以下のデータは架空のもので、データビジュアライゼーションの技術に焦点を当てることができます。

import pandas as pd# 架空のサンプルデータフレームを定義df = pd.DataFrame(          {'feature 1' : ['cat 1', 'cat 2', 'cat 3', 'cat 4'],           'feature 2' : [400, 300, 200, 100]          })

Seabornを使用して、タイトルを持つ単色のバープロットを作成してみましょう。

import seaborn as sns# サンプルデータフレームから基本的なバーチャートを作成しますfig、 ax = plt.subplots(1,1, figsize = (6, 4))sns.barplot(data =  df,             x = 'feature 1',             y = 'feature 2',             color = 'tan')# タイトルの追加ax.set_title('意味のあるタイトル')plt.show()

クラッターを削除する

「Clutter is your enemy!」の章では、Nussbaumer Knaflic氏があなたのデータビジュアライゼーションから視覚的なクラッターを特定し、排除する方法について説明しています-このセクションでは、Matplotlibプロットから視覚的なクラッターを削除する方法を示します。

「[…]すべての要素があなたの聴衆の認知負担になります。」-Cole Nussbaumer Knaflic氏の「Storytelling with Data」より

Matplotlibプロットの上部と右部の枠線を削除する方法

デフォルトでは、Matplotlibプロットには図のエッジに沿ったいわゆる脊椎のボックスがあります。特に上部と右部の脊椎はデータの可視化を混乱させる可能性があるため、削除する必要があります。

次のコードスニペットを使用して単純に不要な脊椎を削除できます:

# 上部と右部の脊椎を削除ax.spines['right'].set_visible(False)ax.spines['top'].set_visible(False)

他の脊椎も削除する場合は、'bottom''left' を使用します。また、 x- 軸と y- 軸全体の境界線を含めて削除する場合は、 ax.axis('off') を使用できます。

Matplotlibプロットから目盛りを削除する方法

通常、目盛りはクラッターとは見なされません。しかし、この例のように、棒グラフの x- 軸の目盛りが冗長な場合があります。

# x-軸の目盛りを削除ax.tick_params(bottom = False)

y- 軸の目盛りも削除する場合は、 left = False を使用します。

これで、クラッターが削除された例は次のようになります:

Matplotlibプロットでクラッターを削除する前と後。

視覚的なクラッターが排除されたことにより、新しいプロットがより落ち着いた感覚を与えることはないでしょうか?

強調を減らす

章「デザイナーのように考える」で、Nussbaumer Knaflicは必要だが関連性の低い情報を静かにする方法を示しています。このセクションでは、Matplotlibプロットの重要度が低い部分の色を変更する方法を説明します。

「必要ですが、メッセージに影響を与えないアイテムを背景に押し込んでください。[…] 薄灰色はこれに適しています。」— Cole Nussbaumer Knaflic、「Storytelling with Data」

Matplotlibプロットで個別の棒の色をカスタマイズする方法

sns.barplot メソッドの color パラメータを palette パラメータに置き換えて、各棒の色を制御できます。これにより、薄灰色を使用して重要でない棒を強調を減らし、メインカラーで関連する棒のみを強調表示することができます。

# 各棒の色を定義するcustom_colors = ['lightgrey', 'tan', 'lightgrey', 'lightgrey']# 重要でない棒を強調を減らすsns.barplot(data =  df,             x = 'feature 1',             y = 'feature 2',             palette = custom_colors) 

Matplotlibプロットのx-軸とy-軸の色を変更する方法

次に、x- 軸と y- 軸の色も静かにしたいと思います。そのためには、軸の脊椎、目盛り、ラベルの色を静かにする必要があります:

# 脊椎の色を静かにするax.spines['left'].set_color('grey')   ax.spines['bottom'].set_color('grey')# 目盛りの色を静かにするax.tick_params(colors = 'grey')# ラベルの色を静かにするax.set_xlabel('feature 1', color = 'grey')ax.set_ylabel('feature 2', color = 'grey')

これで、重要度が低い情報が強調を減らされた例は次のようになります:

Matplotlibプロットで重要度が低い情報を強調を減らす前と後。

テキストはあなたの友達:注釈を追加する

Nussbaumer Knaflicは、データの視覚化にテキストを追加して、キーポイントを強調することが重要であると強調しています。このセクションでは、Matplotlibプロットにテキストを追加するためのax.annotate()メソッドを見ていきます。

「もし聴衆に達してほしい結論があるなら、それを言葉で述べてください。」- Cole Nussbaumer Knaflic, 「Storytelling with Data」より

Matplotlibプロットにテキスト注釈を追加する方法

Matplotlib図にテキストを追加するには、テキストとプロット内の場所を引数として取るax.annotate()メソッドを使用できます。さらに、水平方向の配置(ha)や垂直方向の配置(va)やフォントサイズなどの側面を指定することができます。

# テキスト注釈を追加ax.annotate('Look at "cat 2". \nThis is important!',             xy = (1.5, 360),               ha = 'center',              fontsize = 11,           )

何かを指すために追加の矢印を持ちたい場合、以下のパラメータを使用する必要があります:

  • xy:注釈を付ける点-矢印が向かう場所
  • xytext:テキストを配置する場所(矢印が終わる場所)
  • arrowprops = {'arrowstyle' : '->'}:矢印の見た目

Matplotlibプロットの棒グラフに値を追加する方法

個々の棒に値を追加するには、ax.patchesを反復処理する必要があります。各barに対して、get_height()get_width()、およびget_x()メソッドを使用して、棒の上に値を配置できます。

# 値で棒グラフに注釈を付けるfor bar in ax.patches:    ax.annotate(int(bar.get_height()),                xy = (bar.get_x() + bar.get_width() / 2, bar.get_height()),                 ha = 'center',                 va = 'center',                xytext = (0, 8),                textcoords = 'offset points'                )

これで、テキスト注釈が追加された例は次のようになります:

Before and after adding text annotations in the Matplotlib plot.

強調する

「聴衆の注意を集中させる」章では、Nussbaumer Knaflicは、視覚的に前処理された属性をどのように活用して、観客の注意を必要なものに向けるかについて説明しています。このセクションでは、Matplotlibプロットのテキスト注釈に適用できるいくつかの単純な調整について説明します。

「[…]前処理された属性を戦略的に使用すれば、私たちは、観客がそれを見る前に彼らが見ることを望むものを見ることを可能にすることができます。」- Cole Nussbaumer Knaflic, 「Storytelling with Data」より

Matplotlib注釈でテキストの一部またはすべてを太字にする方法

太字のテキストを使用すると、データの視覚化の重要な部分を強調できます。注釈の一部だけを強調表示したい場合は、文字列内の$\\bf{}$を使用して、強調表示するテキストを中括弧に配置します。注釈全体を強調表示したい場合は、パラメータfontweight = 'bold'を追加するだけです。

# テキストの一部のみを太字にするax.annotate('Look at "cat 2". \nThis is $\\bf{important}$!',             #...           )# テキスト全体を太字にするax.annotate('Look at "cat 2". \nThis is important!',             #...            fontweight='bold',           )

Matplotlib 注釈のテキストの色を変更する方法

データ可視化において、特定の要素に特定のテキストを関連付けるために、同じ色を使用することがあります。テキスト注釈に色をつけるには、ax.annotate() メソッドに color パラメーターを追加するだけです。

# Remove ticks on x-axisax.tick_params(bottom = False)# Add important take away to plot ax.annotate('Look at "cat 2". \nThis is $\\bf{important}$!', # Emphasize important terms            xy = (1.5, 360),             ha = 'center',            color = 'tan',             fontsize = 11,           )

これで、重要な情報を強調した例は以下のようになります。

Before and after emphasizing important information in the Matplotlib plot.

要約

下記に、これらの小さな Matplotlib のトリックがデータ可視化にもたらす違いが示されています。単に混雑を取り除き、テキスト注釈を追加し、重要でない情報を強調するのではなく、重要な情報を強調することで、例のデータ可視化の可読性に大きな違いが生じます。

Before and after applying important information in the Matplotlib plot.

下記に、最終的なデータ可視化を作成するコードが示されています。

import matplotlib.pyplot as pltimport seaborn as sns# Define color palettehighlight_color = 'tan'muted_color = 'dimgrey'muted_color2 = 'lightgrey'custom_colors = [muted_color2, 'tan', muted_color2, muted_color2]# Create a basic bar chart from the example dataframefig, ax = plt.subplots(1,1, figsize = (6, 4))sns.barplot(data =  df,             x = 'feature 1',             y = 'feature 2',             palette = custom_colors) # De-emphasize less important bars# Add titleax.set_title('Meaningful Title')# Mute colors of labelsax.set_xlabel('feature 1', color = muted_color)ax.set_ylabel('feature 2', color = muted_color)# Remove unimportant spines and mute color of remaining spinesax.spines['right'].set_visible(False)      # Remove top and right spinesax.spines['top'].set_visible(False)        # Remove top and right spines ax.spines['left'].set_color(muted_color)   # Mute colors of spinesax.spines['bottom'].set_color(muted_color) # Mute colors of spines# Remove ticks on x-axis and mute colors of ticksax.tick_params(bottom = False,        # Remove ticks on x-axis    colors = muted_color,             # Mute colors of ticks)# Annotate bar chart with valuesfor i, bar in enumerate(ax.patches):    ax.annotate(int(bar.get_height()),    xy = (bar.get_x() + bar.get_width() / 2, bar.get_height()),     ha = 'center',     va = 'center',    xytext = (0, 8),    textcoords = 'offset points',    color = custom_colors[i])# Add important take away to plot ax.annotate('Look at "cat 2". \nThis is $\\bf{important}$!', # Emphasize important terms            xy = (1.5, 360),             ha = 'center',            color = highlight_color,             fontsize = 11,           )     plt.show()

Cole Nussbaumer Knaflic の「Storytelling with Data」は、私のお気に入りのデータ可視化の本の一つです。データ可視化をさらに向上させる方法に興味がある場合は、この本をぜひお勧めします。

Matplotlib のトリックに興味がある場合は、このレポジトリには、Andre Gaskov が Matplotlib を使用して書籍から多くの可視化を再現しています。

GitHub – empathy87/storytelling-with-data: Plots from the book “Storytelling with data”…

PythonとMatplotlibを使用した書籍「Storytelling with data」のプロット実装 – GitHub

github.com

この記事が役に立ったら?

無料で新しい記事が投稿された際に通知を受け取るために登録してください。

1か月に無料で読める記事が3つを超えたい場合は、月額5ドルのVoAGIメンバーになりましょう。私の紹介リンクを使用して登録すると、あなたに追加費用はかからず、私は手数料を受け取ることができます。

VoAGIメンバーとして、あなたの会費の一部はあなたが読むライターに送られ、すべてのストーリーに完全アクセスできます…

VoAGI.com

LinkedIn、Twitter、Kaggleでも見つけることができます!

参考文献

画像の出典

それ以外の場合は、すべての画像は著者によって作成されています。

Webと文献

Knaflic, Cole. Storytelling With Data: A Data Visualization Guide for Business Professionals, Wiley, © 2015.

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