1

この画像を生成するためにpylabを使用しています: 凡例がめちゃくちゃな画像

伝説は私が望んでいたものではありません。ドットは実際のデータ ポイントを表し、線は polyfit で作成されます。凡例には、色ごとに線と点が結合された 10 個のエントリ、または 10 個の点線のみが含まれるようにしたいと考えています。

関連するコード:

for i in range(start, start + size*chunks):
    colorVal = scalarMap.to_rgba(values[i])
    slc1, slc2 = start + i*size, start + (i+1)*size
    mylegend.append(" = ".join([self.dtypes[v1],
                              "%.2f" %data[v1, slc1]]))
    jx = data[x, slc1:slc2]
    jy = data[y, slc1:slc2]
    p  = np.polyfit(jx, jy, deg = 2)
    lx = np.linspace(jx[0], jx[-1], 1000)
    ly = p[0]*lx**2 + p[1]*lx + p[2]
    pl.plot(jx, jy, "o", color = colorVal)
    pl.plot(lx, ly, color = colorVal)
pl.xlabel(self.dtypes[x])
pl.ylabel(self.dtypes[y])
pl.title(title)
pl.axis(axis)
pl.legend(my_legend, loc = "upper left", shadow = True)
pl.grid("on")
pl.show()

私は間違いが何であるかを理解しています: my_legend リストに 10 個のポイントを追加すると、pylab の凡例関数はリストが終了するまでそこから読み取ります。したがって、成功するのは半分だけです。しかし、私はそれを修正する方法がわかりません。凡例関数がループの反復ごとに 1 つのエントリのみを登録するようにする方法はありますか?

また、ポイントを逆順で記載していただきたいです。私は試した

pl.legend(my_legend[::-1])

しかし、それはうまくいきませんでした。

これら2つの問題に対するアイデアはありますか?

4

1 に答える 1

2

の動作はpylab.legend、それがどのように機能するかを理解すると、流用されます。を呼び出すとpylab.legend(my_legend, ...)、ラベルの文字列のリストが描画された最初の 10 行に関連付けられます。このように、最初の 10 行は最初の 5 つのループで追加されたものです。ドットだけを表示するには、次のようにします。

for i in range(start, start + size*chunks):
    [...]
    label = " = ".join([self.dtypes[v1], "%.2f" %data[v1, slc1]])
    [...]
    pl.plot(jx, jy, "o", color = colorVal, label=label)
    pl.plot(lx, ly, color = colorVal)

[...]
pl.legend(loc = "upper left", shadow = True)

label=label線の凡例が必要な場合は、を他のプロット コマンドに入れるだけです。

別の方法として、mylinesリストを作成し ( と同様mylegend)、プロット コマンドを 1 つだけ追加してから、pl.legend(mylines, mylegend, ...)

于 2013-04-09T18:51:39.673 に答える