2014-10-21 25 views
5

Tôi muốn tạo một lô với các điểm đánh dấu khác nhau và các màu khác nhau theo giá trị của 2 vectơ bên ngoài.âm mưu phân tán matplotlib với các điểm đánh dấu và màu sắc khác nhau

Dưới đây là những gì tôi đã cố gắng:

>>> s = [u'+', u'+', u'o'] 
>>> col = ['r','r','g'] 
>>> x = np.array([1,2,3]) 
>>> y = np.array([4,5,6]) 
>>> pl.scatter(x,y,marker=s,c=col) 
Traceback (most recent call last): 
    File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 233, in set_marker 
    Path(marker) 
    File "/usr/lib/python3/dist-packages/matplotlib/path.py", line 133, in __init__ 
    vertices = np.asarray(vertices, np.float_) 
    File "/usr/lib/python3/dist-packages/numpy/core/numeric.py", line 460, in asarray 
    return array(a, dtype, copy=False, order=order) 
ValueError: could not convert string to float: '+' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3/dist-packages/matplotlib/pyplot.py", line 3087, in scatter 
    linewidths=linewidths, verts=verts, **kwargs) 
    File "/usr/lib/python3/dist-packages/matplotlib/axes.py", line 6298, in scatter 
    marker_obj = mmarkers.MarkerStyle(marker) 
    File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 162, in __init__ 
    self.set_marker(marker) 
    File "/usr/lib/python3/dist-packages/matplotlib/markers.py", line 236, in set_marker 
    raise ValueError('Unrecognized marker style {}'.format(marker)) 
ValueError: Unrecognized marker style ['+', '+', 'o'] 
>>> 

EDIT: đề xuất việc giải pháp trên ví dụ mô phỏng nhưng nó không hoạt động trên vấn đề thực sự của tôi. (Tôi không biết tại sao).

Đây mã đầy đủ của tôi:

import matplotlib.pyplot as pl 
import numpy as np 
locY = np.linspace(0, 1, 50) #in the real data locX and locY are coordinate of the points 
locX = np.linspace(0,1,50) 
p = 50 

C = {0: [0, 13, 14, 19, 22, 30], 16: [1, 16, 17], 20: [15, 18, 20, 24], 37: [4, 8, 9, 33, 37, 40, 47], 41: [5, 7, 28, 32, 34, 36, 39, 41, 42, 44, 46], 26: [6, 26, 27, 29, 31, 35], 45: [10, 11, 12, 38, 43, 45, 48, 49], 21: [2, 3, 21, 23, 25]} 
     index = C.keys() 

     def plot_cluster(C, index): 
      color_map = ['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'] 
      colors = [] 
      m_type = [] 


      for i in range(p): 
       for pos, k in enumerate(index): 
        if i in C[k]: 
         #colors.append(pos) 
         colors.append(color_map[pos]) 
         if i == k: 
          m_type.append(u'+') 
         else: 
          m_type.append(u'o') 


      fig = pl.scatter(locX, locY, c=colors, s=30, cmap='spectral') 
      fig = pl.locator_params(nbins=3) 
      fig = pl.xlim(-0.2, 1.2) 
      fig = pl.ylim(-0.2, 1.2) 
      fig = pl.locator_params(nbins=5, axis='y') 

      return fig 

    pl.show(plot_cluster(C, index)) 

Nếu tôi thay thế một phần âm mưu với câu trả lời đề nghị tôi có được chỉ có 2 điểm trong cốt truyện (Tôi không biết tại sao)

Làm thế nào tôi có thể giải quyết?

Trả lời

9

này hoạt động:

s = [u'+', u'+', u'o'] 
col = ['r','r','g'] 
x = np.array([1,2,3]) 
y = np.array([4,5,6]) 

for _s, c, _x, _y in zip(s, col, x, y): 
    plt.scatter(_x, _y, marker=_s, c=c) 

plt.xlim(0, 4) 
plt.ylim(0, 8) 

plt.show() 

Rendering như thế này:

Plot of above code

Cập nhật

Dường như bạn có thể có nhiều màu sắc và có một cuộc gọi duy nhất để các chức năng phân tán: . Tính năng nhiều màu được xác nhận trên API nhưng không đọc được rằng bạn có thể chỉ định một lần lặp cho kwarg đánh dấu. Mã của bạn hoạt động nếu bạn xóa marker=s

+0

Tác phẩm này trên ví dụ được mô phỏng nhưng không có trong mã thực. Tôi đã cập nhật câu hỏi – Donbeo

+0

Nếu tôi cố chạy mã đó, tôi nhận được thông báo "đối tượng AttributeError: 'module' không có thuộc tính 'show'" tức là một vấn đề với dòng cuối cùng. Bạn có thể kiểm tra lại nó –

+0

nó hoạt động cho tôi. Hãy cẩn thận với thụt đầu dòng và sử dụng nhập khẩu matplotlib.pyplot là pl và nhập numpy là np tại đầu – Donbeo

Các vấn đề liên quan