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

Python matplot lib轴混淆将字符串映射到轴,python,python-3.x,numpy,matplotlib,Python,Python 3.x,Numpy,Matplotlib,我对下面代码的输出感到非常困惑。情节是这样的 我显示输出的原因只是为了显示,无论出于什么原因,圆和八角形似乎混淆了。八角形标签应该比圆少很多。我不知道为什么这个情节被贴错标签,在网上也找不到任何关于它的信息。我需要x轴保持这种形状顺序。你知道我做错了什么吗 作为参考,plot_数据是一个元组,如下所示 (array_of_unimportance, string shape_classifier(i.e. "Rectangle"), float rgb_val range(0,1.0)) 我用

我对下面代码的输出感到非常困惑。情节是这样的

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

作为参考,plot_数据是一个元组,如下所示

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

我用plt.xticks()将[“圆”、“八角形”、“六边形”、“矩形”]映射到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()

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

@是的,我的名字不好。绘图数据是图形上的实际点,而数据仅用于创建颜色方案。我已经删除了“数据”,因为它对手工操作的问题并不重要,如果不知道绘图数据的结构,我想几乎没有人可以说。基本上,您必须创建。@T先生,我已经在答案的底部对其进行了更新。x是矩形、圆形、正方形或六边形的字符串列表,y是介于0.0到1.0之间的浮点。问题似乎是覆盖了x轴标签,但如果没有可复制的数据集,很难说。当您只有三个类别时,为什么示例输出中的四个类别都充满了数据?这是我无法理解的。@T先生,我有四个类别,但八角形的使用远远少于圆形。我相信两者在标签上有所不同,但我不明白为什么。我创建了一个代码示例,允许您测试自己并编辑问题。我通常绘制NaN值。不需要删除它们,并且确保它们不会干扰图形。或者有任何情况,它们可能会干扰绘图?@Mr.T您可以使用
s=ax.scatter(order,np.empty(len(order))*np.nan)
,然后不删除任何内容。我不认为它们会伤害你,但是当然你在ax.collections中有一个额外的艺术家,你需要记住它是无缘无故存在的,一旦这是相关的。
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()
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()