カテゴリー

当サイトはアフィリエイトプログラムによる収益を得ています〈景品表示法に基づく表記です)

plt

【plt&subplot】pythonのpltで複数グラフを1つの画像に描く

2021年6月29日

こんな人にオススメ

そういえばpythonのmatplotlib.pyplotpltで複数のグラフを同時に1つの画像にするにはどうするんだ?

ということで、今回はmatplotlib.pyplotpltsubplotを使用して複数のグラフを1つの画像として作成する。今までは1つのグラフに複数のプロットを入れるか、全グラフをバラバラにするかしかなかったが、subplotでキレイに見やすくグラフを作成できる。

なお、使用データは1次関数から4次関数まで。

python環境は以下。

  • Python 3.9.4
  • numpy 1.20.3
  • matplotlib 3.4.2

運営者のメガネです。YouTubeTwitterInstagram、自己紹介はこちら、お問い合わせはこちらから。

運営者メガネ

subplotを使わない場合

1つのグラフに複数のプロットを入れると、縦軸の値が極端に異なっていたりしたら見づらくなる。2軸にすれば2種類は解決するが、3種類以上だと対応しにくい。

また、全グラフをバラバラに作成してしまうとその分だけ画像の数が増えてしまって見づらく管理も大変になる。

全てのプロットを1つのグラフに

全てのグラフを1つのグラフに入れる場合はシンプルにforでプロットを回せばいいが、今回のように1次関数から4次関数までだと、その値の差が大きすぎて1次関数と2次関数の形状の違いがわかりにくい。

もちろん次数が上がると極端に数値が大きくなるということを言いたいのであればこれでいいのだが、パッと見でグラフの値を比較したい時には不向き。

2軸グラフで対処

2軸グラフを使用すればある程度の対処は可能。しかし、今回のように1次関数と2次関数、3次関数と4次関数でそれぞれ極端に値が異なるとこちらも見づらいグラフになる。

さらに、このグラフだと青と橙、赤と緑がそれぞれのセットに見えるが実はそうではない。コードを見ればわかるが、実は赤と青、緑と橙がセットのグラフなのだ。

このままだと誤解を与えかねないので、2軸グラフでも適切とはいえないだろう。

もはや全プロットをバラバラのグラフで作成

もはやバラバラで作成するパターン。この場合は大きなグラフで閲覧することは可能だが、グラフの数だけファイルが作成されるので管理も大変だしそれぞれを閲覧するのも大変。

ということで、これらを解消するための一つの案としてsubplotを紹介する。

下準備

import numpy as np
import matplotlib.pyplot as plt

# 作成したグラフをインタラクティブに操作可能にする
plt.ion()
# グラフ画像の端をオレンジで着色
plt.rcParams['savefig.edgecolor'] = 'darkorange'

x = np.arange(10)

まずは下準備としてimport関連と初期設定と横軸の値。plt.ion()とすることで、ipythonを使用したときにインタラクティブにグラフを作成することが可能。

執筆者は基本的にVScodeの「Code Runner」という拡張機能を使用しているのでion()にしなくてもいいが、Code Runnerの場合はpltのグラフを表示して確認することができないため一応記載。

Code RunnerなどのVScodeの拡張機能については以下参照。

また、今回はグラフの端を橙色で着色してグラフの端を強調している。そのためplt.rcParamsで画像保存の際の橋の色を設定した。plt.rcParamsをすることで設定が一時的に上書きされる。解除したかったら元の設定を上書きするか、exitしてpythonを抜ければい。

シンプルに2つのプロットを並べる

まずはシンプルに2種類のグラフを横もしくは縦に並べる。グラフはfigaxの書き方で書くことにする。一応plt.の方法もあるが、カスタムしやすいのはfig, axの方だからそうする。

左右に並べる

左側に1次関数、右側に2次関数を配置した。マーカーはそれぞれ円形と三角形で作成。plt.figure()内にlinewidth引数を設定しないと保存時のグラフ枠の色付けができないので引数を設定。

fig.suptitleはグラフ全体のタイトルを示している。注意点はsubtitleではなくsuptitleということ。

# 左右で作成
# linewidthを入れないとグラフにオレンジ(darkorange)の囲いができない
fig = plt.figure(linewidth=1)
fig.suptitle('subplot(left & right): ax1, ax2')

# 左
y1 = x ** 1
ax1 = fig.add_subplot(1, 2, 1)
ax1.set_title('ax1')
ax1.set_xlabel("x")
ax1.set_ylabel("y1")
ax1.plot(x, y1, 'o-')

# 右
y2 = x ** 2
ax2 = fig.add_subplot(1, 2, 2)
ax2.set_title('ax2')
ax2.set_xlabel("x")
ax2.set_ylabel("y2")
ax2.plot(x, y2, '^-')

fig.savefig('subplot_lr')

fig.add_subplotfig.add_subplot((行の数), (列の数), (何番目のグラフか))という指定。「何番目か」は左上が1で右に行くにつれて+1され、右端まで行けば1行下の左端まで行っての繰り返し。

fig.add_subplot(1, 2, 1)は1行2列のグラフの1番目(左)にプロット、fig.add_subplot(1, 2, 2)は1行2列のグラフの2番目(右)にプロットという意味。

上下に並べる

続いては上側に1次関数、下側に2次関数を配置した。先ほどとは異なり横長なのでグラフの印象がガラリと変わる。もちろん使用しているデータは同じ。

fig.add_subplot(2, 1, 1)は2行1列のグラフの1番目(上)にプロット、fig.add_subplot(2, 1, 2)は2行1列のグラフの2番目(下)にプロットという意味。

# 上下で作成
fig = plt.figure(linewidth=1)
fig.suptitle('subplot(top & bottom): ax1, ax2')

# 上
y1 = x ** 1
ax1 = fig.add_subplot(2, 1, 1)
ax1.set_title('ax1')
ax1.set_xlabel("x")
ax1.set_ylabel("y1")
ax1.plot(x, y1, 'o-')

# 下
y2 = x ** 2
ax2 = fig.add_subplot(2, 1, 2)
ax2.set_title('ax2')
ax2.set_xlabel("x")
ax2.set_ylabel("y2")
ax2.plot(x, y2, '^-')

fig.savefig('subplot_tb')

4分割で四方に並べる

続いては4分割にして四方に並べる。イメージは左上、右上、左下、右下。

1から4の順番に並べる

左上、右上、左下、右下の4分割にする場合はfig.add_subplot2, 2に設定して、1, 2, 3, 4の数字を最後に書く。描画の順番は左上、右上、左下、右下で1, 2, 3, 4

# subplotを4分割で

fig = plt.figure(linewidth=1)
fig.suptitle('subplot: ax1, ax2, ax3, ax4')

# 左上
y1 = x ** 1
ax1 = fig.add_subplot(2, 2, 1)
ax1.set_title('ax1')
ax1.set_xlabel("x")
ax1.set_ylabel("y1")
ax1.plot(x, y1, 'o-')

# 右上
y2 = x ** 2
ax2 = fig.add_subplot(2, 2, 2)
ax2.set_title('ax2')
ax2.set_xlabel("x")
ax2.set_ylabel("y2")
ax2.plot(x, y2, '^-')

# 左下
y3 = x ** 3
ax3 = fig.add_subplot(2, 2, 3)
ax3.set_title('ax3')
ax3.set_xlabel("x")
ax3.set_ylabel("y3")
ax3.plot(x, y3, 's-')

# 右下
y4 = x ** 4
ax4 = fig.add_subplot(2, 2, 4)
ax4.set_title('ax4')
ax4.set_xlabel("x")
ax4.set_ylabel("y4")
ax4.plot(x, y4, 'd-')

fig.savefig('subplot_4')

プロット順番はバラバラでもOK

もちろん描画する順番に決まりはない。今回のグラフは右下のax4を初めに描いた。その結果、ax4yラベルが左下のax3の下に入ってしまい、上書きされてしまっている。

# 順番はこちらで指定可能

fig = plt.figure(linewidth=1)
fig.suptitle('subplot: ax4, ax1, ax2, ax3')

# 右下
# 初めに描いたので一番下に描かれる
y4 = x ** 4
ax4 = fig.add_subplot(2, 2, 4)
ax4.set_title('ax4')
ax4.set_xlabel("x")
ax4.set_ylabel("y4")
ax4.plot(x, y4, 'd-')

# 左上
y1 = x ** 1
ax1 = fig.add_subplot(2, 2, 1)
ax1.set_title('ax1')
ax1.set_xlabel("x")
ax1.set_ylabel("y1")
ax1.plot(x, y1, 'o-')

# 右上
y2 = x ** 2
ax2 = fig.add_subplot(2, 2, 2)
ax2.set_title('ax2')
ax2.set_xlabel("x")
ax2.set_ylabel("y2")
ax2.plot(x, y2, '^-')

# 左下
y3 = x ** 3
ax3 = fig.add_subplot(2, 2, 3)
ax3.set_title('ax3')
ax3.set_xlabel("x")
ax3.set_ylabel("y3")
ax3.plot(x, y3, 's-')

fig.savefig('subplot_4_position')

4分割して3枚しか描かない

もちろん4枚分の領域を用意したからと言って必ずしも4枚のグラフを表示する必要はない。ここではax1, ax2, ax3の3つのグラフのみを用意してグラフを作成した。

ax4 = fig.add_subplot(2, 2, 4)

を入れた場合は右下にグラフの枠だけを表示することが可能。この文を入れなかった場合は完全な空白となる。

片側は大きなグラフで他方を小さく

作成するsubplotのサイズを複数種にすることで、大きさの異なるグラフを作成することが可能。上の例ではax1(1, 2, 1)の1行2列、右側のax2ax4はそれぞれ(2, 2, 2), (2, 2, 4)で2行2列のsubplot2番目と4番目にグラフを描いている。

# ax1は1行2列、ax2, x4を2行2列で作成することでax3の位置をax1で使用することが可能

fig = plt.figure(linewidth=1)
fig.suptitle('subplot: ax1, ax2, ax4')

# ax1は1行2列
ax1 = fig.add_subplot(1, 2, 1)
ax1.set_title('ax1')
ax1.set_xlabel("x")
ax1.set_ylabel("y1")
y1 = x ** 1
ax1.plot(x, y1, 'o-')

# ax2は2行2列
ax2 = fig.add_subplot(2, 2, 2)
ax2.set_title('ax2')
ax2.set_xlabel("x")
ax2.set_ylabel("y2")
y2 = x ** 2
ax2.plot(x, y2, '^-')

# ax4も2行2列
ax4 = fig.add_subplot(2, 2, 4)
ax4.set_title('ax4')
ax4.set_xlabel("x")
ax4.set_ylabel("y4")
y4 = x ** 4
ax4.plot(x, y4, 'd-')

fig.savefig('subplot_124')

forループで楽してsubplot

これまではいちいち全プロットを指定して作成したが、もちろんforループでも作成可能。forループの際にはplt.subplotsplt.subplotもあるが別物なので注意)を使用してaxを作成する。

# 使用するマーカー一覧
markers = ['o-', '^-', 's-', 'd-']

fig, ax = plt.subplots(nrows=2, ncols=2, linewidth=1)
fig.suptitle('subplot(loop): ax1, ax2, ax3, ax4')

# axを展開して2次元から1次元に(2*2=4の配列になる)
ax = ax.ravel()

for num, m in enumerate(markers):
    ax[num].set_title(f"ax{num + 1}")
    ax[num].set_xlabel('x')
    ax[num].set_ylabel(f"y{num + 1}")

    y = x ** (num + 1)
    ax[num].plot(x, y, m)

fig.savefig('subplot_loop')

このaxは2次元配列になっているので、.ravel()で1次元へと展開。あとはax[num]ax1などを指定してグラフを作成。ループを使用することでかなりスッキリしているし、コードの修正箇所も少なくて済む。展開前後のaxは以下。

fig, ax = plt.subplots(nrows=2, ncols=2, linewidth=1)
fig.suptitle('subplot(loop): ax1, ax2, ax3, ax4')

print(ax)
# [[<AxesSubplot:> <AxesSubplot:>]
#  [<AxesSubplot:> <AxesSubplot:>]]
print(type(ax))
# <class 'numpy.ndarray'>
print(ax.shape)
# (2, 2)

# axを展開して2次元から1次元に(2*2=4の配列になる)
ax = ax.ravel()
print(ax)
# [<AxesSubplot:> <AxesSubplot:> <AxesSubplot:> <AxesSubplot:>]
print(type(ax))
# <class 'numpy.ndarray'>
print(ax.shape)
# (4,)

軸を共有

subplotでグラフを作成していると、軸の値が同じな場合がある。そんな時は軸の共有で軸の値を省略することが可能。

横・縦軸どちらも共有

まずは横・縦軸ともに共有した場合。共有しているので、図の左側と下側にのみラベルが振られるようになる。

markers = ['o-', '^-', 's-', 'd-']

# 横・縦軸を共有
fig, ax = plt.subplots(nrows=2, ncols=2, sharex=True, sharey=True, linewidth=1)
fig.suptitle('subplot(x, y share): ax1, ax2, ax3, ax4')
ax = ax.ravel()
for num, m in enumerate(markers):
    ax[num].set_title(f"ax{num + 1}")
    ax[num].set_xlabel('x')
    ax[num].set_ylabel(f"y{num + 1}")

    y = x ** (num + 1)
    ax[num].plot(x, y, m)

fig.savefig('subplot_share_xy')

一方で共有しているので値が極端に異なる場合はその違いがぱっと見ではわかりにくい。

そんな時は横軸だけ共有のように片側だけ共有することももちろん可能。

横軸だけ共有

今度は横軸のみを共有。sharexだけにしてshareyを消せばいい。この場合だと縦軸の値がそれぞれのグラフに割り当てられるので、極端な値の違いがあってもパッと見でプロット形状がわかりやすい。

markers = ['o-', '^-', 's-', 'd-']

# 横軸を共有
fig, ax = plt.subplots(nrows=2, ncols=2, sharex=True, linewidth=1)
fig.suptitle('subplot(x share): ax1, ax2, ax3, ax4')
ax = ax.ravel()
for num, m in enumerate(markers):
    # fig.add_subplot(2, 2, X)はX=1から始まるが、ax[X]はX=0から始まるのに注意
    ax[num].set_title(f"ax{num + 1}")
    ax[num].set_xlabel('x')
    ax[num].set_ylabel(f"y{num + 1}")

    y = x ** (num + 1)
    ax[num].plot(x, y, m)
fig.savefig('subplot_share_x')

グラフの余白や間隔を調節

ここまで色々subplotでグラフを作成したが、どうにもグラフの軸ラベル同士が重なることが多い。プロット領域にまでラベルが来ているのでグラフの邪魔となる。

以下ではグラフの余白やグラフ同士の間隔を調節することでグラフを見やすくしている。

数字で設定

まずはグラフの調節を数値で行う方法。plt.subplots_adjustを使用することでグラフの余白の大きさやグラフ同士の間隔を調節することが可能。

plt.subplots_adjustで使用した引数は以下。なお、left, rightに関してはグラフの左端を0、右端を1に、top, bottomに関してはグラフの下端を0、上端を1とする。

  • left: グラフ全体の左端から、左側のグラフのプロット部左端までの間隔
  • right: グラフ全体の左端から、右側のグラフのプロット部右端までの間隔
  • top: グラフ全体の下端から、上側のグラフのプロット部上端までの間隔
  • bottom: グラフ全体の下端から、下側のグラフのプロット部下端までの間隔
  • wspace: グラフの近いプロット部の左右端同士の間隔
  • hspace: グラフの近いプロット部の上下端同士の間隔
markers = ['o-', '^-', 's-', 'd-']

fig, ax = plt.subplots(nrows=2, ncols=2, linewidth=1)
fig.suptitle('subplot(loop): ax1, ax2, ax3, ax4')
ax = ax.ravel()

# それぞれの値を調節
plt.subplots_adjust(
    left=0.1,  # グラフ左を0とした時の左の余白
    bottom=0.1,  # グラフ左を0とした時の下の余白
    right=0.95,  # グラフ左を0とした時の右の余白
    top=0.9,  # グラフ左を0とした時の上の余白
    wspace=0.3,  # グラフの横の間隔
    hspace=0.5,  # グラフの縦の間隔
)

for num, m in enumerate(markers):
    ax[num].set_title(f"ax{num + 1}")
    ax[num].set_xlabel('x')
    ax[num].set_ylabel(f"y{num + 1}")

    y = x ** (num + 1)
    ax[num].plot(x, y, m)

fig.savefig('subplot_adjust')

なお、新たなfigを宣言するとplt.subplots_adjustの設定は失われる。ずっと持続させたいなら最初に書いたplt.rcParamsを使用して設定する。

自動調節

いちいち値を調節するのが面倒な時はconstrained_layout引数で設定することで勝手に自動調節してくれる。

fig, ax = plt.subplots(nrows=2, ncols=2, constrained_layout=True, linewidth=1)
fig.suptitle('subplot(loop): ax1, ax2, ax3, ax4')
ax = ax.ravel()

for num, m in enumerate(markers):
    ax[num].set_title(f"ax{num + 1}")
    ax[num].set_xlabel('x')
    ax[num].set_ylabel(f"y{num + 1}")

    y = x ** (num + 1)
    ax[num].plot(x, y, m)

fig.savefig('subplot_constrained')

また、fig.tight_layout()を指定することでも自動調節してくれる。

fig, ax = plt.subplots(nrows=2, ncols=2, linewidth=1)
fig.suptitle('subplot(tight_layout): ax1, ax2, ax3, ax4')
ax = ax.ravel()

for num, m in enumerate(markers):
    ax[num].set_title(f"ax{num + 1}")
    ax[num].set_xlabel('x')
    ax[num].set_ylabel(f"y{num + 1}")

    y = x ** (num + 1)
    ax[num].plot(x, y, m)

fig.tight_layout()

fig.savefig('subplot_tight_layout')

plt.GridSpecで各グラフサイズをバラバラにする

最後に各グラフのサイズをバラバラに作成するということについて解説する。簡単なグラフに関しては既に上で解説した通りだが、ここではさらに複雑なものを作成してみる。

1グラフずつサイズ調節

このグラフでは4行3列のグリッドを作成し、このグリッドに沿うようにデータを作成する。グリッドのイメージは以下。あくまでもイメージなので、実際には多少の値の違いなどは見られるかもしれん。赤文字が行・列のグリッドの番号。その他は余白や間隔の位置。

4行3列のグリッドの内、以下のように区画を区切ることでグラフを作成した。

  • ax1: 0行目 × 0, 1列目
  • ax2: 0行目 × 2列目
  • ax3: 1, 2, 3行目 × 0列目
  • ax4: 2, 3行目 × 1, 2列目
fig = plt.figure(linewidth=1)
fig.suptitle('subplot(grid): ax1, ax2, ax3, ax4')

# 4行3列のグリッドを作成
grid = plt.GridSpec(4, 3)

# 0行目だけ、0と1列目の2列分を使用
ax1 = fig.add_subplot(grid[0, 0:2])
# 0行目だけ、2列目だけを使用
ax2 = fig.add_subplot(grid[0, 2:])
# 1から3行目、0列目だけを使用
ax3 = fig.add_subplot(grid[1:, 0])
# 2と3行目、1と2列目を使用
ax4 = fig.add_subplot(grid[2:, 1:])

ax1.set_title('ax1')
ax1.set_xlabel("x")
ax1.set_ylabel("y1")
y1 = x ** 1
ax1.plot(x, y1, 'o-')

ax2.set_title('ax2')
ax2.set_xlabel("x")
ax2.set_ylabel("y2")
y2 = x ** 2
ax2.plot(x, y2, '^-')

ax3.set_title('ax3')
ax3.set_xlabel("x")
ax3.set_ylabel("y3")
y3 = x ** 3
ax3.plot(x, y3, 's-')

ax4.set_title('ax4')
ax4.set_xlabel("x")
ax4.set_ylabel("y4")
y4 = x ** 4
ax4.plot(x, y4, 'd-')

fig.savefig('subplot_grid')

なお、変数grid, ax1, ax2, ax3, ax4の値とタイプの出力値は以下。

forループで一気に調節

先ほどはグリッドを決めてaxを1つずつ追加してきたが、もちろんforループで一気に処理することも可能。変数にグリッドの情報を入れたらいいだけ。応用。

また、ここではグラフの余白や間隔を調節して多少は見やすくしている。調節は辞書のadjustを使用し、これをplt.GridSpecの後で**で展開。別にplt.GridSpec(left=...)と書いてもいいが面倒なので展開。

# グラフ調整用の辞書
adjust = dict(
    left=0.1,
    bottom=0.1,
    right=0.95,
    top=0.9,
    wspace=0.6,
    hspace=1.1,
)

fig = plt.figure(linewidth=1)
fig.suptitle('subplot(loop): ax1, ax2, ax3, ax4')

# 4行3列のグリッドを作成
# グリッドの調整を「**」の展開で行う
grid = plt.GridSpec(4, 3, **adjust)
grids = [grid[0, 1], grid[0, 2:], grid[1:, :2], grid[1:3, 2:]]

markers = ['o-', '^-', 's-', 'd-']

for num, (grid, m) in enumerate(zip(grids, markers)):
    ax[num] = fig.add_subplot(grid)
    ax[num].set_title(f"ax{num + 1}")
    ax[num].set_xlabel('x')
    ax[num].set_ylabel(f"y{num + 1}")
    y = x ** (num + 1)
    ax[num].plot(x, y, m)

fig.savefig('subplot_grid_loop')

グラフの調節は既に書いたようにplt.subplots_adjust

# それぞれの値を調節
plt.subplots_adjust(
    left=0.1,  # グラフ左を0とした時の左の余白
    bottom=0.1,  # グラフ左を0とした時の下の余白
    right=0.95,  # グラフ左を0とした時の右の余白
    top=0.9,  # グラフ左を0とした時の上の余白
    wspace=0.3,  # グラフの横の間隔
    hspace=0.5,  # グラフの縦の間隔
)

で調節しても無視される。また、constrained_layoutを使用しても警告&無視され、sharex, shareyだとエラー。

# grid使用中にconstrained_layout=Trueをすると警告が出て調整されない
fig = plt.figure(constrained_layout=True, linewidth=1)
# UserWarning: There are no gridspecs with layoutgrids. Possibly did not call parent GridSpec with the "figure" keyword
#   fig.savefig('subplot_grid_loop')

# sharex, shareyはエラー
fig = plt.figure(linewidth=1, sharex=True, sharey=True)
# TypeError: __init__() got an unexpected keyword argument 'sharex'

plt.GridSpecなしでもグリッドは作成可能

既に上で書いたように、subplotの作成領域の個数を調整することでもグリッドは作成可能。ここではax2を描かずに右の真ん中を空けてみた。

adjust = {
    'figure.subplot.left': 0.11,
    'figure.subplot.bottom': 0.1,
    'figure.subplot.top': 0.9,
    'figure.subplot.right': 0.98,
    'figure.subplot.hspace': 0.8,
    'figure.subplot.wspace': 0.3,
}
for key, val in adjust.items():
    plt.rcParams[key] = val

fig = plt.figure(linewidth=1)
fig.suptitle('subplot(unuse grid): ax4, ax1, ax3')

ax4 = fig.add_subplot(1, 2, 1)
ax4.set_title('ax4')
ax4.set_xlabel("x")
ax4.set_ylabel("y4")
y4 = x ** 4
ax4.plot(x, y4, 'd-')

ax1 = fig.add_subplot(3, 2, 2)
ax1.set_title('ax1')
ax1.set_xlabel("x")
ax1.set_ylabel("y1")
y1 = x ** 1
ax1.plot(x, y1, 'd-')

ax3 = fig.add_subplot(3, 2, 6)
ax3.set_title('ax3')
ax3.set_xlabel("x")
ax3.set_ylabel("y3")
y3 = x ** 3
ax3.plot(x, y3, 'd-')

fig.savefig('subplot_grid_unuse_grid')

最後の最後なので、グラフの余白や間隔の調節はplt.rcParamsで行った。ipythonなどをしていると、そのpythonをexitしない限りは設定が保持されるので注意。裏を返せばexitしない限りは設定した項目が保持されるので、グラフを描くごとに設定しなくてもいい。

パッと見の理解を速める

今回はmatplotlib.pyplotpltsubplotについて簡単なグラフを作成した。最近はずっとplotlyのボタンでグラフの切り替えを設定し、複数プロットは1つのグラフに納めていた。

しかし、そうすると静止画で保存したときにボタンを押した後のグラフは見ることができない。今回のようにsubplotを使用することでパッと見でグラフの概要を掴むことができるのでおすすめ。

パッと見で理解できることで無駄に時間を使用することがなく、スムーズに内容の話ができると思う。

関連記事

plt

【plt&pandas】df.plot()でmatplotlibのグラフを作成

2022/8/19

こんな人にオススメ pandasのデータフ& ...

Pythonでの比較

【plotly&pandas】df.plot()でPlotlyのグラフを作成

2022/8/19

こんな人にオススメ pnadasのデータフ& ...

Python基礎

【文字入力&グラフに反映】inputとtkinterでグラフに任意の文字を反映

2022/8/19

こんな人にオススメ グラフを作成 ...

plt

【plt&マーカー一覧】matplotlibのマーカーをグラフ化

2022/8/19

こんな人にオススメ matplotlib.pyplot、pltのマ ...

ガジェット

2023/9/18

【デスクツアー2022下半期】モノは少なく、でも効率的に Desk Updating #0

今回はガジェットブロガーなのにデスク環境を構築していない執筆者の ...

ライフハック

2023/9/16

【Audible vs YouTube Premium】耳で聴く音声学習コンテンツを比較

ワイヤレスイヤホンが普及し耳で学習することへのハードルが格段に下 ...

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

2023/9/18

【SENNHEISER MOMENTUM True Wireless 3レビュー】全てが整ったイヤホン

今回は高音質・高機能なSENNHEISERのフラグシップ完全ワイヤレスイヤホン「SENNH ...

ライフハック

2023/3/11

【YouTube Premiumとは】メリットしかないから全員入れ

今回はYouTube Premiumを実際に使ってみてどうなのか、どんなメリット/デメリット ...

マウス

2023/8/17

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

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

ベストバイ

2023/9/18

【ベストバイ2022】今年買って良かったモノのトップ10

2022年ベストバイ この1年を振り返って執筆者は何を買ったのか。ガジェッ& ...

スマホ

2023/1/15

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

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

マウス

2023/9/16

【Logicool MX ERGO vs MX Master 3】ERGOをメインにした決定的な理由

こんな疑問・お悩みを持っている人におすすめ 執筆者はLogicoolのハイエンӠ ...

macOSアプリケーション

2022/9/30

【Chrome拡張機能】便利で効率的に作業できるおすすめの拡張機能を18個紹介する

こんな人におすすめ Chromeの拡張機能を入れたいけど、調べても同じような ...

macOSアプリケーション

2023/5/3

【Automator活用術】Macで生産性を上げる作業の自動化術

今回はMacに標準でインストールされているアプリ「Automator」を使ってできる ...

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

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

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

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

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

  • この記事を書いた人

メガネ

Webエンジニア駆け出し。独学のPythonで天文学系の大学院を修了。常時金欠のガジェット好きでM2 Pro MacBook Pro(30万円) x Galaxy S22 Ultra(17万円)使いの狂人。自己紹介と半生→変わって楽しいの繰り返しレビュー依頼など→お問い合わせ運営者情報、TwitterX@m_ten_pa、 YouTube@megatenpa、 Threads@megatenpa

-plt
-, , ,