「対数って、よく分からない。何が便利なの?」という方のために、ドラゴンボールの戦闘力を、Pythonのmatploblibを使って実演してみました。
まずは、matplotlibを使うための、いつものおまじないです。
%matplotlib inline
import matplotlib
import matplotlib.pyplot as plt
matplotlib でうまく日本語フォントが表示されない問題はこちらで解決しました。
font = {'family': 'IPAexGothic'}
matplotlib.rc('font', **font)
ドラゴンボールの戦闘力はこちらの資料から取得しました。
data = [
["農夫", 5],
["孫悟空 (12歳)", 10],
["孫悟空 (13歳;亀仙人の修行後)", 100],
["ジャッキー・チュン(亀仙人)", 120],
]
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
どうでしょうか。ラディッツに「ゴミ」と罵られた屈強な農夫さんが戦闘力5だというのは有名な話ですが、それに比べて12歳の悟空の強いこと。そして、亀仙人の修行によって悟空はさらに強くなりました。亀仙人の修行すげー。そして、それに勝っちゃう亀仙人、本当にすげー。
さらにお話は進みます。天津飯という鶴仙流の強敵が現れました。
data.append(["孫悟空 (16歳)", 180])
data.append(["天津飯 (20歳)", 180])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
天津飯と悟空は互角。二人とも凄まじい強さです。ちなみに、天津飯と戦う少し前の悟空は、レッドリボン軍という軍隊を壊滅させるほどの強さです。
その後、恐怖のピッコロ大魔王が現れました。
data.append(["孫悟空 (16歳;超神水飲用後)", 260])
data.append(["ピッコロ大魔王(若返り後)", 260])
data.append(["ヤジロベー(18歳)", 190])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
ドラゴンボールの力により若返ったピッコロ大魔王は超絶な強さです。一方、悟空は一度は敗退しましたが、超神水のおかげでピッコロ大魔王を倒すだけの強さを手に入れました。それにしても、ヤジロベーつえー!
ピッコロ大魔王を倒して平和が訪れたと思ったのもつかの間、ピッコロの生まれ変わりが復讐に現れました。
data.append(["孫悟空 (19歳)", 910])
data.append(["ピッコロ(マジュニア;3歳)", 900])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
今までのピッコロ大魔王がゴミに見えるような、新生ピッコロの強さ!!でも悟空は神様の元で修行をしたおかげで、なんとか撃退できるだけの強さを手に入れていました。
悟空は結婚し、悟飯が生まれ、そのうち悟空の兄のラディッツが地球を襲撃します。
data.append(["ラディッツ", 1500])
data.append(["孫悟飯(4歳)", 1307])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
一生懸命働いている農夫さんをラディッツが「ゴミ」と称したのもよく分かるわ。ラディッツつえー。
悟空とピッコロは力を合わせて、なんとかラディッツを倒しました。それにしても4歳の孫悟飯、つえー!!
続いて、自分が宇宙一強いと思ってるベジータがナッパを連れて地球を襲撃しました。
data.append(["栽培マン", 1200])
data.append(["ナッパ", 4000])
data.append(["孫悟空(25歳)", 8000])
data.append(["ベジータ(地球襲撃時)", 18000])
data.append(["孫悟空(25歳;界王拳3倍)", 24000])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
ナッパさんはラディッツのことを「よわむしラディッツ」と呼んでいたのがよくわかります。そしてベジータの強さ。ピッコロ大魔王の恐怖はどこへやら。孫悟空は界王拳3倍という、体に無理をする戦法でようやくベジータを退けました。
舞台はナメック星に移ります。
data.append(["ベジータ(悟空に半殺しにされた後)", 24000])
data.append(["ザーボン", 23000])
data.append(["ザーボン(変身後)", 30000])
data.append(["ベジータ(ザーボンに半殺しにされた後)", 35000])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
「死の淵から蘇ると強くなれる」というズルイ特性をもつサイヤ人。地球で悟空に半殺しの目にあったベジータは、ナメック星到着時にはさらに強くなりました。だけど宇宙は広い。変身後のザーボンさんに半殺しの目にあいます。
data.append(["ギニュー", 120000])
data.append(["孫悟空(ナメック星到着時)", 90000])
data.append(["孫悟空(界王拳)", 180000])
data.append(["ピッコロ(ナメック星到着時)", 75000])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
フリーザ様が招聘したギニュー特戦隊のギニュー隊長の強さは、なんども半殺しの目にあって強くなったベジータをさらに大きく上回っていました。ところがそれをさらに上回るのが、ナメック星に遅れて到着した孫悟空。界王拳を使った時の戦闘力180000に驚くギニュー隊長の顔は有名です。
data.append(["フリーザ(変身前)", 530000])
data.append(["フリーザ(第2形態)", 1000000])
data.append(["ピッコロ(ネイルと合体後)", 1500000])
data.append(["フリーザ(第3形態)", 2000000])
data.append(["ベジータ(クリリンに半殺しにされた後)", 3000000])
data.append(["フリーザ(最終形態)", 3600000])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
ところがそんな悟空もギニュー隊長も、「私の戦闘力は530000です」というフリーザ様の宇宙的強さには敵いません。ネイルと合体したピッコロが一時フリーザ様(第2形態)を上回りましたが、第3形態のフリーザ様にボコボコにやられます。ベジータは今度はクリリンに半殺しの目にあって強くなる作戦に出ました。ズルイ。ところがそれでも、最終形態のフリーザ様には敵わず、ガクブルして涙を流します。
data.append(["孫悟空(フリーザ戦当初)", 3000000])
data.append(["フリーザ(最終形態;マックスパワー)", 100000000])
data.append(["孫悟空(界王拳20倍)", 60000000])
data.append(["孫悟空(スーパーサイヤ人)", 150000000])
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.show()
ここで終わりではありません。最終形態のフリーザ様はまだまだ本気を出していなかった!!悟空も強くなったけど、本気になったフリーザ様には敵わない!界王拳20倍になっても敵わない!そのうちクリリンが殺されてぶちぎれた孫悟空が超サイヤ人に変身してやっと勝てましたとさ。めでたし、めでたし。
、、、だが少し待って欲しい。改めてグラフを見直してみると、、、
変身前のフリーザ様(530000)ですら、ゴミみたいに小さくて見えない!!!
このままでは、ゴミみたいな奴らの比較ができないではないか!!!
ちなみに、レッドリボン軍なんざ、戦闘力150前後の頃の悟空に壊滅させられたんだぞ!!
それを解決できるのが対数です!
matplotlib なら plt.xscale('log') と書くだけで対数表示ができます!便利!
names = list(reversed([x[0] for x in data]))
values = list(reversed([x[1] for x in data]))
plt.figure(figsize=(5, len(data)/2))
plt.barh(names, values)
plt.xlabel("戦闘力")
plt.xscale('log')
plt.show()
ほうら、よく見えるようになったろう。
追記:
これを見て改めて思ったんだが、レッドリボン軍って、戦闘力 150 前後の頃の悟空に壊滅させられてたんだな...
その後、復讐に燃えて、戦闘力 150000000 (当時の 1,000,000 倍)に成長した悟空を倒そうとしたドクター・ゲロの執念すごい。