Googleデータポータルで表形式データの条件付き色付けをする

2022.06.06

概要

Pythonでplotlyを使って表形式のデータを細かい条件をつけて色付けしようとしていたのですができなくて困っていたのですがGoogleデータポータルで実現できました。

やりたかったこと

こんな表形式のデータで、データの値が特定の閾値未満だったら赤色の文字で表示したかったんです。

# 1.データの準備
import pandas as pd
from sklearn.datasets import load_iris

iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df.head()

# 2.シンプルな可視化
import plotly.graph_objects as go


# 動作確認のため、シンプルに小さく
df = df.sample(20)

columns = df.columns
values = df.values.T

fig = go.Figure(data=[go.Table(header=dict(values=columns),
                 cells=dict(values=values))
                     ])
fig.show()

plotlyで以下のように各セルごとの色を指定し、可視化します。

# 3.条件付き色付け

font_color = []
for column in columns:
  if column == 'sepal length (cm)':
    font_color.append(['red' if v < 5.0 else 'black' for v in df[column].values])
  elif column == 'sepal width (cm)':
    font_color.append(['red' if v < 2.8 else 'black' for v in df[column].values])
  elif column == 'petal length (cm)':
    font_color.append(['red' if v < 2.0 else 'black' for v in df[column].values])
  elif column == 'petal width (cm)':
    font_color.append(['red' if v < 0.5 else 'black' for v in df[column].values])
  else:
    raise ValueError("error!")

fig = go.Figure(
    data=[
          go.Table(
              header=dict(values=columns),
              cells=dict(
                  values=values,
                  font=dict(size=14, color=font_color)
                  )
              )
          ])
fig.show()

お、いい感じに対象の数字の色付けができてそうです!

と思ったのですが少しスクロールしてみると...

条件通りに色付けができなくなってしまいました...。 原因を調べてみると以下のように既知の問題のようでした。

https://github.com/plotly/plotly.js/issues/3167

Googleデータポータルで対応

なんとか他にいい方法はないかと考えた結果、Googleデータポータルで可視化する方法で対応することとしました。 まずはデータをGoogleスプレッドシートに出力します。

## データポータルとの連携のためにスプレッドシートに出力
## 参考にした⇨https://colab.research.google.com/notebooks/snippets/sheets.ipynb#scrollTo=6d0xJz3VzLOo

# 1.必要なライブラリをインポートしたり、認証したり
from google.colab import auth
auth.authenticate_user()

import gspread
from google.auth import default
creds, _ = default()

gc = gspread.authorize(creds)

# 2.スプレッドシートをGoogleDriveに作成
spread_sheet_name = 'iris'
sh = gc.create(spread_sheet_name)

# 3.「シート1」を開く
worksheet = gc.open(spread_sheet_name).sheet1

# 4.pre_run_dfのデータでシート内容を上書き
df_headers = [df.columns.values.tolist()]
df_values = df.values.tolist()
worksheet.update(df_headers+df_values)

続いてGoogleデータポータルで「データソース」を作成します。 これで先ほど出力したGoogleスプレッドシートを参照します。

続いて、「レポート」を作成します。 レポートでは先ほど作成した「データソース」を参照して可視化するダッシュボードを作成します。

「レポート」を作成し、

先ほど作成したデータソースを追加します。

ダッシュボードの作成画面になりました。

全ての列を表示し、不要な「レコード数」の列を除外しました。
続いて、条件付き色付けの設定をします。「スタイル」⇨「追加」とクリックします。

以下のように、「特定のセルの値」に応じて文字色やセルの背景色を変更できます。
ここでは「sepal length(cm)」の値が5.0未満の場合に文字色を赤色にしてみました。

ちなみに、選択できる条件は以下の通りでした。

また、セルが条件を満たした場合にスタイルを修正する対象については、以下のように選択できます。
自分のセルや行全体のみならず、他の列を指定できるのは面白いですね。

さて、色付けができたかを確認してみると、ちゃんとできてました。

他の列にも適用してスクロールしてみても、ちゃんと色付けができてました。

文字色だけではなくセルの背景色の加工もできます。
文字色を透明にすることもできて面白いです。

まとめ

Pythonでデータを扱っていてデータを可視化する方法について結構苦戦してしまうのですが、Googleデータポータルだと色々簡単にできて便利です。
私はColaboratoryでデータを扱うことが多く、ColaboratoryからだとGoogleスプレッドシート出力からGoogleデータポータルへの連携までが簡単でおすすめです。