代码之家  ›  专栏  ›  技术社区  ›  sf8193

MaToSLIB轴混淆映射到轴的字符串

  •  -1
  • sf8193  · 技术社区  · 8 年前

    下面的代码输出让我很困惑。情节是这样的 plot

    for i in range(0,300):
        test = random.random()
        if test < .10:
            plot_data.append(('filler','Octagon',random.random()))
        elif test >= .10 and test <= .40:
            plot_data.append(('filler','Rectangle',random.random()))
        elif test > .40 and test <= .70:
            plot_data.append(('filler','Circle',random.random()))
        elif test > .70 and test <= 1:
            plot_data.append(('filler','Hexagon',random.random()))
    
    fig = plt.figure()
    N=100
    ax = fig.add_subplot(1, 1, 1)
    
    
    
    x = [data_point[1] for data_point in plot_data]
    x_vals = ["Rectangle","Hexagon","Octagon","Circle"]
    y =[data_point[2] for data_point in plot_data]
    
    print(x)
    ax.scatter(x, y, color = rgb)
    
    plt.xticks(range(len(x_vals)),x_vals)
    plt.xlabel("Polygon")
    plt.ylabel("RGB Color Value")
    
    plt.show()
    

    在代码中间的打印语句显示了我在X轴上所假设的值

    ['Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Octagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle', 'Hexagon', 'Rectangle', 'Circle']
    

    我显示输出的原因是,不管出于什么原因,圆圈和八角形似乎混淆了。八角形的标签应该比圆形少很多。我不知道为什么这个情节被贴上了错误的标签,在网上找不到任何关于它的信息。我需要X轴来保持这个形状的顺序。你知道我做错了什么吗?

    对于reference plot_data是一个看起来像

    (array_of_unimportance, string shape_classifier(i.e. "Rectangle"), float rgb_val range(0,1.0))
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   ImportanceOfBeingErnest    8 年前

    问题是 xticks 只需设置刻度位置和标签,就不会对数据重新排序。
    由于类别按轴上的外观顺序排列,因此它们的顺序可能与默认的期望顺序不一致。一个诀窍是先让轴知道所需的顺序,然后把它按顺序绘制出来,然后再删除它。然后打印数据时,顺序保持不变。

    import matplotlib.pyplot as plt
    import numpy as np
    
    x = ['Octagon', 'Hexagon', 'Circle', 'Rectangle', 'Hexagon', 'Circle']
    y = [1,2,3,4,5,6]
    
    # the desired order of categories along the axis:
    order=["Rectangle", "Hexagon", "Octagon", "Circle"]
    
    fig, ax = plt.subplots()
    #plot some artist first to define order of axis and remove again.
    s = ax.scatter(order, y[:len(order)])
    s.remove()
    # Then plot real values
    ax.scatter(x,y)
    
    plt.show()
    
        2
  •  0
  •   sf8193    8 年前

    我用plt.xticks()将“[”circle“,”八角“,”hexagon“,”rectangle“]映射到0,1之间的整数值,找到了一个解决方案。这不理想,但有效。如果有人有类似的问题,我的代码如下。如果有人有更好的解决办法,我会暂时不提这个问题。

    fig = plt.figure()
    ax = fig.add_subplot(1, 1, 1)
    key = {"Circle":0, "Octagon":0.4,"Hexagon":0.6,"Rectangle":1}
    
    
    x =[key[data_point[1]] for data_point in plot_data]
    y =[data_point[2] for data_point in plot_data]
    x_vals = ["Circle","Octagon","Hexagon","Rectangle"]
    
    plt.xticks([0,0.4,0.6,1.0],x_vals)
    plt.xlabel("Polygon")
    plt.ylabel("RGB Color Value")
    ax.scatter(x, y)
    
    plt.show()