在matplotlib scaterplot中对标签进行排序

时间:2018-11-07 14:26:12

标签: python-3.x matplotlib

我有一个散点图以下代码,相应的图如下所示:

x = ['C9-U2', 'C10-U5', 'C10-U5', 'C11-U1', 'C11-U1']
y = ['J',     'C',      'H',      'J',     'H']
plt.scatter(x,y)

enter image description here

在图中,我想看到两个轴都已排序,即x轴应为[C9,C10,C11](正是这样,因为我已按此顺序输入了数据),并且y轴应为[C,H,J](不是)。

如何确定两个轴都已排序?

3 个答案:

答案 0 :(得分:0)

我改变了创建散点图的方式。

这是我的代码:

import matplotlib.pyplot as plt

# This is your original code.
# x = ['C9-U2', 'C10-U5', 'C10-U5', 'C3-U1', 'C3-U1']
# y = ['J',     'C',      'H',      'J',     'H']
# plt.scatter(x,y)
# plt.show()

ordered_pairs = set([
     ('C9-U2', 'J'),
     ('C10-U5', 'C'),
     ('C10-U5', 'H'),
     ('C3-U1', 'J'),
     ('C3-U1', 'H')
])

x,y = zip(*ordered_pairs)
plt.scatter(x, y)
plt.show()

我将您的数据点转换为set个有序对。这使我们可以zip设置集合,该集合用于通过传递的每个参数来打包和解压缩数组。我们使用*运算符来逆过程。您可以了解有关zip here的更多信息。

运行代码后,显示的图像如下,希望是您正在寻找的图像:

result_of_shown_code

答案 1 :(得分:0)

这实际上是一个问题,目前尚无好的解决方案。轴单位由输入确定。因此,一种解决方案是先按正确的顺序绘制某些内容,然后再将其删除,以手动确定分类顺序。

import matplotlib.pyplot as plt

x = ['C9-U2', 'C10-U5', 'C10-U5', 'C11-U1', 'C11-U1']
y = ['J',     'C',      'H',      'J',     'H']

def unitsetter(xunits, yunits, ax=None, sort=True):
    ax = ax or plt.gca()
    if sort:
        xunits = sorted(xunits)
        yunits = sorted(yunits)
    us = plt.plot(xunits, [yunits[0]]*len(xunits),
                  [xunits[0]]*len(yunits), yunits)
    for u in us:
        u.remove()

unitsetter(x,y)
plt.scatter(x,y)

plt.show()

enter image description here

在这里,sort设置为True,因此您在两个轴上都获得了按字母顺序排序的类别。

如果您有一个自定义命令,则希望轴服从,就像这里的情况(至少对于x轴),您需要将该命令提供给上述功能。

unitsetter(x, sorted(y), sort=False)
plt.scatter(x,y)

enter image description here

答案 2 :(得分:0)

在“ ImportanceOfBeingErnest”之后,代码可能会缩短为

# initial plot to set sorted axis label
us = plt.plot(sorted(x),sorted(y))
[u.remove() for u in us]

# now plot the real thing, sorting not required
plt.scatter(x,y)