web-dev-qa-db-ja.com

入力されたすべてのデータポイントを追跡していなかった場合、matplotlib散布図にy = xを追加する

以下は、matplotlibを使用してさまざまなシリーズの散布図を作成し、y = xという行を追加するコードです。

import numpy as np, matplotlib.pyplot as plt, matplotlib.cm as cm, pylab

nseries = 10
colors = cm.Rainbow(np.linspace(0, 1, nseries))

all_x = []
all_y = []
for i in range(nseries):
    x = np.random.random(12)+i/10.0
    y = np.random.random(12)+i/5.0
    plt.scatter(x, y, color=colors[i])
    all_x.extend(x)
    all_y.extend(y)

# Could I somehow do the next part (add identity_line) if I haven't been keeping track of all the x and y values I've seen?
identity_line = np.linspace(max(min(all_x), min(all_y)),
                            min(max(all_x), max(all_y)))
plt.plot(identity_line, identity_line, color="black", linestyle="dashed", linewidth=3.0)

plt.show()

これを達成するには、散布図に入力されたすべてのx値とy値を追跡して、どこにidentity_lineは開始および終了する必要があります。プロットしたすべてのポイントのリストがない場合でも、y = xを表示する方法はありますか?私はmatplotlibの何かが私に事後のすべてのポイントのリストを与えることができると思いますが、私はそのリストを取得する方法を理解することができませんでした。

18
kuzzooroo

データについて何も知る必要はありませんそれ自体。あなたはあなたのmatplotlib Axesオブジェクトがデータについてあなたに言うことで逃げることができます。

下記参照:

import numpy as np
import matplotlib.pyplot as plt

# random data 
N = 37
x = np.random.normal(loc=3.5, scale=1.25, size=N)
y = np.random.normal(loc=3.4, scale=1.5, size=N)
c = x**2 + y**2

# now sort it just to make it look like it's related
x.sort()
y.sort()

fig, ax = plt.subplots()
ax.scatter(x, y, s=25, c=c, cmap=plt.cm.coolwarm, zorder=10)

ここに良い部分があります:

lims = [
    np.min([ax.get_xlim(), ax.get_ylim()]),  # min of both axes
    np.max([ax.get_xlim(), ax.get_ylim()]),  # max of both axes
]

# now plot both limits against eachother
ax.plot(lims, lims, 'k-', alpha=0.75, zorder=0)
ax.set_aspect('equal')
ax.set_xlim(lims)
ax.set_ylim(lims)
fig.savefig('/Users/paul/Desktop/so.png', dpi=300)

Etvoilà

enter image description here

42
Paul H