首页 > 解决方案 > 使用 ax 对象将 matplotlib 图的 x 标签更改为特定单词

问题描述

给出以下数据:

mock_data_x = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3]
mock_data_y = [1, 2, 3, 4, 5, 1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
mock_data_val = [
    "a",
    "b",
    "c",
    "d",
    "e",
    "d",
    "e",
    "a",
    "b",
    "c",
    "d",
    "a",
    "b",
    "e",
    "c",
]
df_mock = pd.DataFrame(dict(x=mock_data_x, y=mock_data_y, v=mock_data_val,))

看起来像:

    x  y  v
0   1  1  a
1   1  2  b
2   1  3  c
3   1  4  d
4   1  5  e
5   2  1  d
6   2  2  e
7   2  3  a
8   2  4  b
9   2  5  c
10  3  1  d
11  3  2  a
12  3  3  b
13  3  4  e
14  3  5  c

我可以创建以下情节:

fig, ax = plt.subplots(figsize=(8, 5))

x_axis_labels = ["one", "two", "three"]

values = df_mock["v"].unique()
for val in values:
    dt = df_mock[df_mock["v"].eq(val)]
    ax.scatter(dt["x"], dt["y"])
    ax.plot(dt["x"], dt["y"])

positions = [1, 2, 3]
labels = ["r", "q"]
_ = plt.xticks(positions, x_axis_labels)

看起来像:

在此处输入图像描述

我觉得好像应该有一个替代线

_ = plt.xticks(positions, x_axis_labels)

实际使用ax对象而不是plt.

我查看了dir(ax), 和dir(ax.xaxis), 并不清楚我应该使用什么来实现这一点。

标签: pythonmatplotlibplotdata-visualization

解决方案


等价于ax

ax.set_xticks(positions)
ax.set_xticklabels(x_axis_labels)

你得到几乎相同的情节。

但是,对于这种情况,您可以简单地使用map和 pandas 的绘图功能:

maps = {p:v for p,v in zip(positions, x_axis_labels)}

fig, ax = plt.subplots(figsize=(8,5))
(df_mock.set_index(['x','v'])['y']
     .unstack()
     .rename(index=maps)
     .plot(marker='o', ax=ax)
)

输出:

在此处输入图像描述


推荐阅读