【问题标题】:iterating markers in plots迭代图中的标记
【发布时间】:2018-09-12 21:22:36
【问题描述】:

我试图用颜色和正确的标签来表示预测,作为虹膜数据集的标记。这是我目前所拥有的:

from sklearn.mixture import GMM
import pandas as pd
from sklearn import datasets
import matplotlib.pyplot as plt
import itertools

iris = datasets.load_iris()
x = iris.data
y = iris.target
gmm = GMM(n_components=3).fit(x)
labels = gmm.predict(x)
fig, axes = plt.subplots(4, 4)
Superman = iris.feature_names
markers = ["o" , "s" , "D"]
Mi=[]
for i in range(150):
  Mi.append(markers[y[i]])

for i in range(4):
    for j in range(4):
        if(i != j):
            axes[i, j].scatter(x[:, i], x[:, j], c=labels, marker = Mi, s=40, cmap='viridis')
        else:
            axes[i,j].text(0.15, 0.3, Superman[i], fontsize = 8)

我不确定为什么颜色会迭代而标记不会,但是有没有办法为每个标记分配一个特定的值,比如颜色?当我从 y 输入数值时,它也会失败。

它返回的代码是:

无法识别的标记样式 ['o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o', 'o' ,'o','o','o','o','o','o','o','o','o','o','o','o',' o','o','o','o','o','o','o','o','o','o','o','o','o' ,'o','o','o','o','o','o','o','o','o','o','o','o',' o','o','s','s','s','s','s','s','s','s','s','s','s' ,'s','s','s','s','s','s','s','s','s','s','s','s',' s','s','s','s','s','s','s','s','s','s','s','s','s' ,'s','s','s','s','s','s','s','s','s','s','s','s',' s'、's'、'D'、'D'、'D'、'D'、'D'、'D'、'D'、'D'、'D'、'D'、'D' ,'D','D','D','D','D','D','D','D','D','D','D','D',' D','D','D','D','D','D','D','D','D','D','D','D','D' ,'D','D','D','D','D','D','D','D','D','D','D','D',' D', 'D']

【问题讨论】:

    标签: python matplotlib markers


    【解决方案1】:

    在单个散点图中使用多个标记目前不是 matplotlib 支持的功能。然而,https://github.com/matplotlib/matplotlib/issues/11155

    对此有一个功能请求

    当然可以绘制多个散点图,每个标记类型一个。 另一种选择是我在上面的帖子中提出的,即在创建散点图后设置标记:

    import numpy as np
    import matplotlib.pyplot as plt
    
    def mscatter(x,y,ax=None, m=None, **kw):
        import matplotlib.markers as mmarkers
        if not ax: ax=plt.gca()
        sc = ax.scatter(x,y,**kw)
        if (m is not None) and (len(m)==len(x)):
            paths = []
            for marker in m:
                if isinstance(marker, mmarkers.MarkerStyle):
                    marker_obj = marker
                else:
                    marker_obj = mmarkers.MarkerStyle(marker)
                path = marker_obj.get_path().transformed(
                            marker_obj.get_transform())
                paths.append(path)
            sc.set_paths(paths)
        return sc
    
    
    N = 40
    x, y, c = np.random.rand(3, N)
    s = np.random.randint(10, 220, size=N)
    m = np.repeat(["o", "s", "D", "*"], N/4)
    
    fig, ax = plt.subplots()
    
    scatter = mscatter(x, y, c=c, s=s, m=m, ax=ax)
    
    plt.show()
    

    如果您只有数字,而不是标记符号,您首先需要将数字映射到符号并将符号列表提供给函数。

    【讨论】:

      【解决方案2】:

      您可以像下面这样修改您的代码以获得所需的结果:

      markers = ["o" , "s" , "D"]
      colors = ["red", "green", "blue"]
      
      for i in range(4):
          for j in range(4):
              for k in range(x.shape[0]):
                  if(i != j):
                      axes[i, j].scatter(x[k, i], x[k, j], color=colors[labels[k]], marker = markers[y[k]], s=40, cmap='viridis')  
                  else:
                      axes[i,j].text(0.15, 0.3, Superman[i], fontsize = 8)
      

      【讨论】:

        猜你喜欢
        • 2019-06-02
        • 2021-10-13
        • 2019-02-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-29
        • 2014-01-14
        相关资源
        最近更新 更多