python - 使用 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)
, 并不清楚我应该使用什么来实现这一点。
解决方案
等价于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)
)
输出:
推荐阅读
- java - 使用不同的值多次调用方法
- javascript - Google Analytics - 访问每个站点时显示的位置访问提示
- r - 需要通过排除字符来取最大值
- php - 如何在一个范围内找到值 - laravel
- javascript - React Native 0.60 社交登录问题
- javascript - Groovy:在静态范围内找到表观变量“classVar”,但不引用局部变量、静态字段或类
- sql-server - 当使用特定值更新多个列时,在 VIEW 上使用触发器执行存储过程
- java - 动态杰克逊字段过滤
- terminal - 使用 yq 编辑数组中的 yaml 对象。加速Terminalizer的终端演员(记录)
- tensorflow - 如何获得 Tensorflow hub 模型的混淆矩阵