LoginSignup
4
5

More than 3 years have passed since last update.

最近サイバーパンク風グラフ流行っていません?

Posted at

まずはどんなグラフか?

alt

その特徴は
* ネオンカラーを使う。
* 基本線の前後に透明度の低い線を引いて、ボケ感を出す。
* 透明度の低い面装飾を追加して、ボケ感を追加する。
* 使用するフォントをサイバーっぽい物を使用する。

投稿のキッカケ

  • matplotlib公式サイトmatplotblogがあるのは、皆さんご存知でした?
  • このサイトの最新の投稿がMatplotlib Cyberpunk Styleで上記のグラフの作成について解説しています。(2020/03/27 投稿)
  • NHKスペシャル▽新型コロナウイルス瀬戸際の攻防〜感染拡大阻止(2020/4/11 PM9:00-PM10:04)でもサイバーパンク風グラフが使用されていました。(2020/4/11放送)  2020-04-14 22.11.11.png [引用:NHKスペシャル:NHKプラス再配信から]
  • R界隈でもサイバーパンク風グラフパッケージがリリースされています。(リリース日:2020/04/02)

ggCyberPunk
alt

  • 立て続けにこのようなグラフイメージを見るにつけ、この状況なので「見えない敵」に準えてサイバー感のあるグラフニーズがあるようです。

レシピ

  • まず基本的なプロットを描く
  • ダーク系の背景を設定する
  • カラーをネオン色系に設定する
  • ネオン管のようにグロー感を出す(透明度の低い線を基本線の前後に引く)
  • サイバー感を強めるため、面領域を透明度の低いネオンカラーで塗りつぶす

公式ブログの投稿には、全コードが記載されていますので参考にしてください。

自分的にカスタマイズ

  • このサイバーパンク風にアニメーションを加えたらどんな感じ?
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
# from IPython.display import HTML

fig = plt.figure(figsize=(8, 4.5), dpi=144)
ax = fig.add_subplot(111)

plt.style.use("dark_background")

for param in ['text.color', 'axes.labelcolor', 'xtick.color', 'ytick.color']:
    plt.rcParams[param] = '0.9'  # very light grey

for param in ['figure.facecolor', 'axes.facecolor', 'savefig.facecolor']:
    plt.rcParams[param] = '#212946'  # bluish dark grey

colors = [
    '#08F7FE',  # teal/cyan
    '#FE53BB',  # pink
    '#F5D300',  # yellow
    '#00ff41',  # matrix green
]

n_shades = 10
diff_linewidth = 1.05
alpha_value = 0.3 / n_shades

ims = []
def plot(data):
    plt.cla()
    rand = np.random.randint(1,8,(50,))
    for n in range(1, n_shades+1):
        # 基本線の前後にアルファ値の低い線を描画する
        im = plt.plot(rand, color=colors[3], linewidth=2+(diff_linewidth*n), alpha=alpha_value)
        # 基本線を描画する
        im2 = plt.plot(rand, color=colors[3], marker='o', markersize=3)
        # 線以下を描画する
        im3 = ax.fill_between(x=np.arange(50), y1=rand, y2=[0]*len(rand), color=colors[3], alpha=0.03)
        ims.append(im)
        ims.append(im2)
        ims.append(im3)

ani = animation.FuncAnimation(fig, plot, interval=50)

ax.grid(color='#2A3459')
ax.set_xlim([ax.get_xlim()[0] - 0.2, ax.get_xlim()[1] + 0.2])  # to not have the markers cut off
ax.set_ylim(0)

# グラフ枠を消去
ax.spines["top"].set_linewidth(0)
ax.spines["right"].set_linewidth(0)
ax.spines["left"].set_linewidth(0)
ax.spines["bottom"].set_linewidth(0)

ani.save('./cyberpunk.mp4', writer='ffmpeg', fps=15)

plt.show()

改良点:(公式ブログの骨格を残して、アニメしただけです)
* 基準線の前後にアルファ値の低い線を描く。
* 基本線を描く。
* 面領域を塗りつぶす。
* それをimsに追加して、それをFuncAnimationで実行する。
* なぜかグラブ領域の枠が表示されるので非表示設定をしました。
* 作成したgif画像がQiita.comには上げられなかったのでmp4形式で作成
* その結果グラフ領域の背景が白くに変更されたため、styleをコメントアウトして以下の動画となりました。
ezgif.com-video-to-gif.gif

まとめ

  • 「全然、サイバーぽっく無いじゃん!」というコメントはスルーで、、、
  • サイバーパンク風は意外と簡単に実装できる。
  • 「見えない敵と戦う」この状況に、ならではのニーズがあると思いました。
4
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5