Matplotlib dağılım grafiği açıklaması

Belirli bir alandaki farklı sıcaklıkları temsil etmek için bir 4D dağılım grafiği oluşturdum. Göstergeyi oluşturduğumda, gösterge doğru sembolü ve rengi gösteriyor ancak içinden bir çizgi ekliyor. Kullandığım kod şu şekilde:

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)

Line2DyiScattervescatterolarak değiştirmeyi denedim. Scatter bir hata döndürdü ve scatter grafiği değiştirdi ve bir hata döndürdü.

Scatterile,range(10)`'u veri noktalarını içeren listelere değiştirdim. Her liste x, y veya z değişkenini içerir.

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)

Bunu çalıştırdığımda, gösterge artık mevcut değil, köşede içinde hiçbir şey olmayan küçük beyaz bir kutu.

Tavsiyen var mı?

Çözüm

2D dağılım grafiği

Aşağıdaki örnek kodda olduğu gibi, matplotlib.pyplot modülünün scatter yöntemini kullanmak işe yarayacaktır (en azından Python 2.7.5 ile matplotlib 1.2.1 ile). Ayrıca, dağılım grafikleri kullanıyorsanız, her bir grafik girişi için yalnızca bir noktaya sahip olmak için açıklama çağrısında numpoints=1 yerine scatterpoints=1 kullanın.

Aşağıdaki kodda, aynı aralığı tekrar tekrar çizmek yerine rastgele değerler kullandım ve tüm grafikleri görünür hale getirdim (yani birbiriyle örtüşmüyor).

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()

3D dağılım grafiği

3D'de bir dağılım çizmek için plot yöntemini kullanın, çünkü gösterge bir Axes3D örneğinin scatter yöntemi tarafından döndürüldüğü gibi Patch3DCollection yöntemini desteklemez. İşaretleyici stilini belirtmek için, aşağıdaki örnekte görüldüğü gibi, bunu yöntem çağrısına konumsal bir argüman olarak dahil edebilirsiniz. İsteğe bağlı olarak, hem linestyle hem de marker parametrelerine argüman eklenebilir.

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()

Yorumlar (2)

İşte bunu yapmanın daha kolay bir yolu (kaynak: burada):

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

fig, ax = plt.subplots()
for color in ['red', 'green', 'blue']:
    n = 750
    x, y = rand(2, n)
    scale = 200.0 * rand(n)
    ax.scatter(x, y, c=color, s=scale, label=color,
               alpha=0.3, edgecolors='none')

ax.legend()
ax.grid(True)

plt.show()

Ve bunu alacaksın:

Efsane özellikleri için buraya bir göz atın

Yorumlar (0)

Diğer cevaplar biraz karmaşık görünüyor, scatter fonksiyonuna sadece bir 'label' parametresi ekleyebilirsiniz ve bu, grafiğiniz için açıklama olacaktır.

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],label='Low Outlier')
ll = plt.scatter(random(10), random(10), marker='o', color=colors[0],label='LoLo')
l  = plt.scatter(random(10), random(10), marker='o', color=colors[1],label='Lo')
a  = plt.scatter(random(10), random(10), marker='o', color=colors[2],label='Average')
h  = plt.scatter(random(10), random(10), marker='o', color=colors[3],label='Hi')
hh = plt.scatter(random(10), random(10), marker='o', color=colors[4],label='HiHi')
ho = plt.scatter(random(10), random(10), marker='x', color=colors[4],label='High Outlier')

plt.legend(loc='upper center', bbox_to_anchor=(0.5, -0.05),
          fancybox=True, shadow=True, ncol=4)

plt.show()

İşte çıktınız

Yorumlar (0)