1. ホーム
  2. python

Matplotlib による散布図の凡例

2023-07-25 07:06:29

質問

特定の地域のさまざまな温度を表現するために、4D散布図グラフを作成しました。凡例を作成すると、凡例には正しい記号と色が表示されますが、それを通る線が追加されます。私が使用しているコードは次のとおりです。

colors=['b', 'c', 'y', 'm', 'r']
lo = plt.Line2D(range(10), range(10), marker='x', color=colors[0])
ll = plt.Line2D(range(10), range(10), marker='o', color=colors[0])
l = plt.Line2D(range(10), range(10), marker='o',color=colors[1])
a = plt.Line2D(range(10), range(10), marker='o',color=colors[2])
h = plt.Line2D(range(10), range(10), marker='o',color=colors[3])
hh = plt.Line2D(range(10), range(10), marker='o',color=colors[4])
ho = plt.Line2D(range(10), range(10), marker='x', color=colors[4])
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),numpoints=1, loc='lower left', ncol=3, fontsize=8)

を変更してみました。 Line2DScatter であり scatter . Scatter はエラーを返し scatter はグラフを変更し、エラーを返しました。

とは scatter を変更しました。 range(10) をデータ点を含むリストに変更した。各リストには、x、y、zのいずれかの変数が含まれています。

lo = plt.scatter(xLOutlier, yLOutlier, zLOutlier, marker='x', color=colors[0])
ll = plt.scatter(xLoLo, yLoLo, zLoLo, marker='o', color=colors[0])
l = plt.scatter(xLo, yLo, zLo, marker='o',color=colors[1])
a = plt.scatter(xAverage, yAverage, zAverage, marker='o',color=colors[2])
h = plt.scatter(xHi, yHi, zHi, marker='o',color=colors[3])
hh = plt.scatter(xHiHi, yHiHi, zHiHi, marker='o',color=colors[4])
ho = plt.scatter(xHOutlier, yHOutlier, zHOutlier, marker='x', color=colors[4])
plt.legend((lo,ll,l,a, h, hh, ho),('Low Outlier', 'LoLo','Lo', 'Average', 'Hi', 'HiHi',     'High Outlier'),scatterpoints=1, loc='lower left', ncol=3, fontsize=8)

これを実行すると、凡例はもはや存在せず、隅に小さな白い箱があり、その中には何も入っていません。

何かアドバイスがあればお願いします。

どのように解決するのですか?

2次元散布図

を使用して scatter メソッドで matplotlib.pyplot モジュールが動作するはずです (少なくとも matplotlib 1.2.1 と Python 2.7.5 では)。また、散布図を使っている場合は、以下のように scatterpoints=1 よりも numpoints=1 を使用することで、各伝説のエントリに1つのポイントだけを持たせることができます。

以下のコードでは、同じ範囲を何度もプロットするのではなく、ランダムな値を使用し、すべてのプロットが見えるようにしています(つまり、互いに重ならないようにしています)。

import matplotlib.pyplot as plt
from numpy.random import random

colors = ['b', 'c', 'y', 'm', 'r']

lo = plt.scatter(random(10), random(10), marker='x', color=colors[0])
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0])
l  = plt.scatter(random(10), random(10), marker='o', color=colors[1])
a  = plt.scatter(random(10), random(10), marker='o', color=colors[2])
h  = plt.scatter(random(10), random(10), marker='o', color=colors[3])
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4])
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4])

plt.legend((lo, ll, l, a, h, hh, ho),
           ('Low Outlier', 'LoLo', 'Lo', 'Average', 'Hi', 'HiHi', 'High Outlier'),
           scatterpoints=1,
           loc='lower left',
           ncol=3,
           fontsize=8)

plt.show()

<イグ

3次元散布図

3Dで散布図を描くには plot メソッドを使用してください。 Patch3DCollection が返すような scatter メソッドによって返されるのと同じように Axes3D インスタンスのメソッドです。markerstyle を指定するには、以下の例に見られるように、メソッド呼び出しの位置引数としてこれを含めることができます。また、オプションで linestylemarker というパラメータがあります。

import matplotlib.pyplot as plt
from numpy.random import random
from mpl_toolkits.mplot3d import Axes3D

colors=['b', 'c', 'y', 'm', 'r']

ax = plt.subplot(111, projection='3d')

ax.plot(random(10), random(10), random(10), 'x', color=colors[0], label='Low Outlier')
ax.plot(random(10), random(10), random(10), 'o', color=colors[0], label='LoLo')
ax.plot(random(10), random(10), random(10), 'o', color=colors[1], label='Lo')
ax.plot(random(10), random(10), random(10), 'o', color=colors[2], label='Average')
ax.plot(random(10), random(10), random(10), 'o', color=colors[3], label='Hi')
ax.plot(random(10), random(10), random(10), 'o', color=colors[4], label='HiHi')
ax.plot(random(10), random(10), random(10), 'x', color=colors[4], label='High Outlier')

plt.legend(loc='upper left', numpoints=1, ncol=3, fontsize=8, bbox_to_anchor=(0, 0))

plt.show()

<イグ