matplot lib轴混淆将字符串映射到轴

时间:2018-07-08 17:29:05

标签: python python-3.x numpy matplotlib

我对下面代码的输出感到非常困惑。情节看起来像这样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()

代码中间的print语句显示了我假定在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']

我显示输出的原因仅仅是为了表明无论出于何种原因,Circle和Octagon似乎都混杂在一起。八角形标签应少于圆形标签。我不知道为什么该地块被贴错标签,并且在网上找不到任何相关信息。我需要x轴保持此形状顺序。有什么想法我做错了吗?

作为参考,plot_data是一个类似

的元组
(array_of_unimportance, string shape_classifier(i.e. "Rectangle"), float rgb_val range(0,1.0))

2 个答案:

答案 0 :(得分:1)

问题在于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()

答案 1 :(得分:0)

我已经找到了一个解决方案,方法是使用plt.xticks()将[“ Circle”,“ Octagon”,“ 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()