修改绘图轴,以便其刻度标签及其相应点的顺序相应更改-无需修改数据本身

时间:2019-05-31 19:39:36

标签: python matplotlib

我想对x轴刻度标签重新排序,以使数据也适当更改。

示例

y = [5,8,9,10]
x = ['a', 'b', 'c', 'd']
plt.plot(y, x)

Original plot

我希望通过修改坐标轴刻度的位置来使图看起来像什么。 Intended image

请注意,我不想通过修改数据顺序来实现

我的尝试

# attempt 1
fig, ax =plt.subplots()
plt.plot(y,x)
ax.set_xticklabels(['b', 'c', 'a', 'd'])
# this just overwrites the labels, not what we intended

# attempt2
fig, ax =plt.subplots()
plt.plot(y,x)
locs, labels = plt.xticks()
plt.xticks((1,2,0,3)); # This is essentially showing the location 
# of the labels to dsiplay irrespective of the order of the tuple.

编辑: 根据评论,这里有一些进一步的说明。

让我们说图1中的第一个点(a,5)。如果我更改了x-axis的定义,现在在第三个位置定义了a,那么它也将反映在图中,这意味着,5上的y-axisa移动,如图2所示。实现此目的的一种方法是重新排序数据。但是,我想看看是否可以通过更改轴位置以某种方式实现它。总而言之,应该根据我们如何定义自定义轴来绘制数据,而无需重新排序原始数据。

1 个答案:

答案 0 :(得分:1)

在x轴类别的两个不同顺序之间切换如下所示

import numpy as np
import matplotlib.pyplot as plt

x = ['a', 'b', 'c', 'd']
y = [5,8,9,10]

order1 = ['a', 'b', 'c', 'd']
order2 = ['b', 'c', 'a', 'd']

fig, ax = plt.subplots()
line, = ax.plot(x, y, marker="o")

def toggle(order):
    _, ind1 = np.unique(x, return_index=True)
    _, inv2 = np.unique(order, return_inverse=True)
    y_new = np.array(y)[ind1][inv2]

    line.set_ydata(y_new)
    line.axes.set_xticks(range(len(order)))
    line.axes.set_xticklabels(order)
    fig.canvas.draw_idle()

curr = [0]
orders = [order1, order2]
def onclick(evt):
    curr[0] = (curr[0] + 1) % 2
    toggle(orders[curr[0]])


fig.canvas.mpl_connect("button_press_event", onclick)

plt.show()

在绘图上的任意位置单击以在order1order2之间切换。