メニュー

【PyScript】Matplotlibを使ってグラフを作ってみた

head内には以下読み込みの記述を入れる。

<link rel="stylesheet" href="https://pyscript.net/latest/pyscript.css">
<script defer src="https://pyscript.net/latest/pyscript.js"></script>

HTML内の呼び出したいところに、以下を記述。

<div id="py-data_hogeHoge"></div>
<py-config type="json">
  {
    "packages": ["numpy", "matplotlib"]
  }
</py-config>
<py-script>
  import numpy as np
  import matplotlib.pyplot as plt
  
  outer_weight = np.array([1, 3, 1, 2, 4])
  outer_label = ["Apple", "Banana", "Ice", "Strawberry", "TABETYAU\nMOGUMOGU"]
  outer_color = ["red", "gold", "cyan", "magenta", "gray"]

  inner_weight = np.array([])
  inner_weight_arr = [
    [.5, .2, .3],
    [.8, .2],
    [1],
    [1],
    [.1, .9]
  ]
  inner_label = []
  inner_label_arr = [
    ["", "KUSATTERU", "Delicious"],
    ["SUBERU\nTalk", "SUBERANAI\nTalk"],
    ["ORE WO Ice"],
    [""],
    ["Diet\nTYOTTODEKIRU", "KANZENNI\nYASETA"]
  ]
  inner_color = []
  inner_color_arr = [
    ["darkgray", "darkgreen", "gold"],
    ["red", "blue"],
    ["firebrick"],
    ["lime"],
    ["firebrick", "#000"]
  ]

  for o_weight, arr_set in zip(outer_weight, inner_weight_arr):
    for arr in arr_set:
      inner_weight = np.append(inner_weight, o_weight*arr)

  for o_label, arr_set in zip(outer_label, inner_label_arr):
    for arr in arr_set:
      inner_label.append(arr)

  for o_color, arr_set in zip(outer_color, inner_color_arr):
    for arr in arr_set:
      inner_color.append(arr)


  radius = 1.5
  width_inner = .6
  width_outer = .4

  inner_wedge = {
    'width' : width_inner,
    'edgecolor' : 'white',
    'linewidth': 1
  }
  inner_text = {
    'color' : 'white',
    'weight': 'bold',
    'ha': 'center',
    'va': 'center'
  }

  outer_wedge = {
    'width' : width_outer,
    'edgecolor' : 'white',
    'linewidth': 1
  }
  outer_text = {
    'color' : 'white',
    'weight': 'bold',
    'ha': 'center',
    'va': 'center'
  }

  fig, ax = plt.subplots(figsize=(8.0, 8.0))
  ax.pie(inner_weight, colors=inner_color, labels=inner_label, counterclock=False, startangle=90, radius=radius-width_outer, wedgeprops=inner_wedge, textprops=inner_text, labeldistance=0.74, rotatelabels=True)
  ax.pie(outer_weight, colors=outer_color, labels=outer_label, counterclock=False, startangle=90, radius=radius, wedgeprops=outer_wedge, textprops=outer_text, labeldistance=.87)
  display(fig, target="py-data_hogeHoge")
</py-script>

ページを表示すると、以下のような画像が出力される。

Matplotlib

ラベルは「\n」で改行可能。「\r\n」はエラーが出る。

labeldistanceで文字の位置を調整する。
ラベルの文字数によっては収まりきらないので、labeldistanceの数値を弄って入るようにすること。

PyScriptを使用するときの注意点

ラベルの日本語対応で、japanize_matplotlibは使えない。

ラベルの文字に日本語を入れると「□□」のように文字化けしてしまう。なので日本語対応したいと考えたが、japanize_matplotlibはPyscriptで使用できるパッケージには含まれていない。

MatplotlibのFontPropertiesを使えば日本語対応できるとのこと。※オブジェクト型だとどうやるんだろう……?

勉強中の資料