カテゴリー

Plotly全般

【plotly&グラフテーマ】plotly既存のthemasをグラフ化

2021年8月4日

こんな人にオススメ

plotlyでグラフを描くときのテンプレートを自分で作成するのが面倒。何か楽にキレイなグラフを描く方法はないの?

ということで、今回はplotlyでグラフを描く際に簡単にグラフの見た目、スタイルを変更する方法について解説する。どうするかというと、規定のテーマを選択するということ。

執筆者の場合は色んなこと対してカスタムすることが好きということで自作でテーマを作成している。しかし、それが面倒とかplotlyを始めたばかりという方もいるだろう。

そんな方は本記事で簡単にグラフのテーマを変更していただければ幸いだ。なお、自作テンプレートについては以下参照。

【随時更新 備忘録】plotlyのグラフ即席作成コード

こんな人にオススメ plotlyっていじれる項目が多くて設定が面倒。何かいいテンプレー| ...

続きを見る

python環境は以下。

  • Python 3.9.4
  • numpy 1.20.3
  • plotly 4.14.3
  • plotly-orca 3.4.2

運営者のメガネです。YouTubeTwitterInstagramも運営してます。

自己紹介はこちらから、お問い合わせはこちら。

運営者メガネ

下準備

import sys
import numpy as np
import plotly.io as pio
import plotly.graph_objects as go
sys.path.append('../../')
import plotly_layout_template as template

まずは下準備としてのimport関連。numpyは後に作るグラフで使用するデータ作成用。plotly_layout_templateは本記事で作成するグラフとかのコードの2つ上のディレクトリにある、自作テンプレート。

今回はconfigを追加するために使用。configについては以下参照。

【plotly&config】グラフのツールバーを編集する

こんな人にオススメ plotlyでグラフを作成すると右上に灰色のバーみたいなものが出て{ ...

続きを見る

plotlyのグラフテーマを知る

print(pio.templates)
# Templates configuration
# -----------------------
#     Default template: 'plotly'
#     Available templates:
#         ['ggplot2', 'seaborn', 'simple_white', 'plotly',
#          'plotly_white', 'plotly_dark', 'presentation', 'xgridoff',
#          'ygridoff', 'gridon', 'none']

print(type(pio.templates))
# <class 'plotly.io._templates.TemplatesConfig'>

plotlyのグラフテーマはいくつか種類があって、どんなものがあるのかを確認するにはpio.templatesとすればいい。そうすると上のコードのようにズラーと出力される。

デフォルトのテーマはplotlyというもので、テンプレートを使用していない時に出てくる紫っぽい青っぽい背景のテーマだ。その他のテーマの選択肢は10種類ある。

テーマの値を取り出し

themes = pio.templates

print(themes.items())
# dict_items([('ggplot2', <object object at 0x11702ad20>), ('seaborn', <object object at 0x11702ad20>), ('simple_white', <object object at 0x11702ad20>), ('plotly', <object object at 0x11702ad20>), ('plotly_white', <object object at 0x11702ad20>), ('plotly_dark', <object object at 0x11702ad20>), ('presentation', <object object at 0x11702ad20>), ('xgridoff', <object object at 0x11702ad20>), ('ygridoff', <object object at 0x11702ad20>), ('gridon', <object object at 0x11702ad20>), ('none', <object object at 0x11702ad20>)])

テーマはdictっぽい感じで取り出すことが可能。上のコードではとりあえず.itemskeysvaluesの両方出した。前半は先程のテーマ名だが後半は執筆者はあまり理解していない。出力するごとに数字部分の値が変わる。多分16進数だからメモリ関係か?

dictっぽく扱うことができるということで、.keysでテーマ名を取りだし。初めにpio.templatesで出力した使用可能なテーマ(Available templates)が出力。

print(themes.keys())
# dict_keys(['ggplot2', 'seaborn', 'simple_white', 'plotly', 'plotly_white', 'plotly_dark', 'presentation', 'xgridoff', 'ygridoff', 'gridon', 'none'])

しかし、.values()は使用できないようだ。あくまでもdictっぽく扱うだけ。

print(themes.values())
#     print(themes.values())
# AttributeError: 'TemplatesConfig' object has no attribute 'values'

dictっぽく扱うことができるということで、最後に名称一覧listで、各名称をforを使って1つずつ出力してみる。

print(list(themes))
# ['ggplot2', 'seaborn', 'simple_white', 'plotly', 'plotly_white', 'plotly_dark', 'presentation', 'xgridoff', 'ygridoff', 'gridon', 'none']

for theme in themes:
    print(theme)
# ggplot2
# seaborn
# simple_white
# plotly
# plotly_white
# plotly_dark
# presentation
# xgridoff
# ygridoff
# gridon
# none

各テーマをグラフ化

colors = (
    'white',
    'silver',
    'black',
    'red',
    'blue',
    'green',
    'yellow',
    'violet',
)

x = np.arange(5)
y = x

ということでこれからテーマごとにグラフを作成するが、まずはグラフ関連の下準備。変数colorsは今回プロットするグラフの色を示す。色々な色のテーマを使用するので、プロットの色も豊富に。

今回プロットするデータは直線データで色ごとにズラしながら作成する。実際にテーマごとにグラフを作成するためのコードが以下。

# 各テーマを使用したグラフを作成
def plotly_themes():

    for theme in themes:
        plot = []
        for num, color in enumerate(colors):

            d = go.Scatter(
                x=x, y=y + num,
                name=color,
                line_color=color,
            )
            plot.append(d)

        layout = go.Layout(
            template=theme,
            title=dict(text=theme),
        )

        fig = go.Figure(data=plot, layout=layout)
        fig.show()

        name = f"plot_themes_{theme}"
        pio.write_html(
            fig, f"{name}.html",
            auto_open=False, config=template.plotly_config(),
        )
        pio.write_image(fig, f"{name}.png")

plotly_themes()

グラフのテーマはgo.Layouttemplate引数で行う。ここに先程のpio.templatesを入れたら完了。以下よりそれぞれのテーマで作成できるグラフをプロットする。

ggplot2


seaborn


simple_white


plotly


plotly_white


plotly_dark


presentation


xgridoff


ygridoff


gridon


none


ボタンを使ってテーマを切り替えたい(失敗)


def plotly_themes_buttons():

    plot = []
    # for theme in themes:
    for num, color in enumerate(colors):

        d = go.Scatter(
            x=x, y=y + num,
            # name=f"{theme}|{color}",
            name=color,
            line_color=color,
        )
        plot.append(d)

    #  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    # ボタンの内容を作成
    buttons = []
    for num, theme in enumerate(themes):

        button = dict(
            label=theme,
            method='update',
            args=[
                dict(),
                dict(title=theme, template=theme),
            ],
        )
        buttons.append(button)

    updatemenus = [
        dict(
            type='buttons',
            direction="right",
            x=0.5, y=1.01, xanchor='center', yanchor='bottom',
            active=0,
            buttons=buttons,
        )
    ]

    #  - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    layout = go.Layout(
        template=theme,
        title=dict(text=theme),
        updatemenus=updatemenus,
    )

    fig = go.Figure(data=plot, layout=layout)
    fig.show()

    name = 'plot_themes_buttons'
    pio.write_html(
        fig, f"{name}.html",
        auto_open=False, config=template.plotly_config(),
    )
    pio.write_image(fig, f"{name}.png")

plotly_themes_buttons()

最後にplotlyのボタン機能を使用してテーマを切り替える方法について解説したかった。が、どうもボタンを使って切り替えることができない。通常のgo.Layoutの引数ならこれでいけるけどなんか無理。

ということで失敗作が上のグラフ。ボタンについては以下参照。

【plotly&ボタン】plotlyのupdatemenusにbuttonsを追加

こんな人にオススメ plotlyってグラフ内にボタンをつけて、そのボタンでプロットを表Ķ ...

続きを見る

【plotly&ボタン】plotlyのupdatemenusに2回押し対応のbuttonsを追加

こんな人にオススメ plotlyでボタンを追加して動作を割り当てることはできたけど、も{ ...

続きを見る

とっかかりには最適

今回はplotlyで使用できる既存のテーマについて解説した。これを知ったのは最近で、こんなに簡単にできるのかという印象。実はこのpio.templates関連で自分でデフォルトテーマを作成することが可能らしい。

今回は既存テーマということでまだ勉強していないが、一回これはチャレンジしてみたい。

既存でそれなりにキレイなグラフを作成できるので、初めてのplotlyとかサクッとキレイにしたい人におオススメ。

関連記事

【plotly&go.Scatter】plotlyの散布図グラフの描き方

こんな人にオススメ plotlyのとっかかりとして散布図(scatter)を描きたいけど、どうやっӗ ...

続きを見る

bubblechart2017_pop
【plotly&バブルチャート】plotlyで各国の収入と平均寿命をバブルチャートで描く

こんな人にオススメplotlyを使ってバブルチャートを作成してみたい!でもでもどんなང ...

続きを見る

【plotly&スライダー】plotlyのslidersにスライダーを追加

こんな人にオススメ plotlyではグラフにスライダーをつけることができるらしいけど、{ ...

続きを見る

【plt vs plotly】matplotlibとgoでグラフの比較

こんな人にオススメ 今までpythonのmatplotlib.pyplot、pltでグラフを作成してきたけど、plotlyってどんな ...

続きを見る

スマホ

2023/1/21

【Galaxy S22 Ultraレビュー】これが最高峰

こんな人におすすめ 2022年最強のスマホGalaxy S22 Ultraって実際使った感じどうなの ...

完全ワイヤレスイヤホン(TWS)

2023/1/15

【SENNHEISER MOMENTUM True Wireless 3レビュー】高レベルでバランス型の高音質イヤホン

こんな人におすすめ SENNHEISER MOMENTUM True Wireless 3って実際のところどうなの? 評判は良い ...

完全ワイヤレスイヤホン(TWS)

2023/1/14

【SONY WF-1000XM4 vs SENNHEISER MTW3】MTW3を選んだ決定的な3つの理由

こんな人におすすめ 執筆者は「SONY WF-1000XM4」「SENNHEISER MOMENTUM True Wireless 3」両方を持っている ...

スマホ

2023/1/15

【楽天モバイル×povo2.0の併用】月1,000円の保険付きデュアルSIM運用

こんな人におすすめ 楽天モバイルとpovo2.0のデュアルSIM運用って実際のとこ ...

マウス

2023/1/5

【Logicool MX ERGOレビュー】疲れない作業効率重視トラックボールマウス

こんな人におすすめ トラックボールマウスの王道Logicool MX ERGOが気になるけどऩ ...

マウス

2023/1/14

【Logicool MX ERGOカスタム】Logi Optionsのジェスチャーボタン設定内容

こんな人におすすめ Logicool MX ERGOをもっと上手に効率的に使いこなしたい。 ボ| ...

生活に役立つ

2023/1/8

【メガネ厳選】クソ便利に使っているサービスやアイテム達

このページでは執筆者「メガネ」が実際に使って便利だと感じているサ ...

完全ワイヤレスイヤホン(TWS)

2023/1/15

【SONY WF-1000XM4レビュー】神とゴミのハーフ&ハーフ

こんな人におすすめ SONYのフラグシップモデル「SONY WF-1000XM4」ってどれくらい性 ...

スイッチボット

2023/1/14

【SwitchBot Hub Mini】アプリにないエアコンなどの家電をその他で登録する方法

こんな人におすすめSwitchBot Hub Miniに我が家のエアコンを登録したいけど、SwitchBotア ...

Pythonを学びたいけど独学できる時間なんてない人へのすゝめ

執筆者は大学の研究室・大学院にて独学でPythonを習得した。

でも社会人になったら独学で行うには時間も体力もなくて大変だ。

時間がない社会人だからこそプロの教えを乞うのが効率的。

ここでは色んなタイプに合ったプログラミングスクールの紹介をする。

  • この記事を書いた人

メガネ

ベンチャー企業のWebエンジニア駆け出し。独学のPythonで天文学系の大学院を修了→新卒を1.5年で辞める→転職→今に至る。
常時金欠のガジェット好きでM1 MacBook Pro x Galaxy S22 Ultraの狂人。

自己紹介と半生→変わって楽しいの繰り返し レビュー依頼などお問い合わせ Twitter@m_ten_pa

-Plotly全般
-, ,