You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Matplotlib中高亮指定X轴标签(如STRIKES的350)

如何将Matplotlib图表中指定X轴标签设置为自定义颜色和字号?

问题背景

我有如下Pandas DataFrame数据:

import pandas as pd

data = {'PEOI': [190, 105, 100, 150, 100, 170], 'PCHOI': [11, 6, 3, 16, 21, 8], 'STKS': [200, 250, 300, 350, 400, 450], 'CCHOI': [3, 8, 13, 18, 3, 23], 'CEOI': [154, 190, 578, 611, 736, 420]}
df = pd.DataFrame(data)
print(df)

我使用以下Matplotlib代码绘图:

import matplotlib.pyplot as plt

plt.style.use("dark_background")
fig, axes = plt.subplots(2, 1, figsize=(17,15))
for (y1, y2), ax in zip([("CEOI", "PEOI"), ("CCHOI", "PCHOI")], axes):
      ax.bar(df["STKS"], df[y1], width=13, label=y1,color = 'blue')
      ax.bar(df["STKS"], df[y2], width=7, label=y2,color = 'yellow')
      ax.set_xlabel("STRIKES", fontsize=24, fontweight="bold", labelpad=10, color ='cyan')
      ax.set_ylabel("OPEN INTEREST", fontweight="bold", fontsize=24, labelpad=10)
      ax.set_xticks(df["STKS"].values)
      ax.tick_params(labelsize=20)
      ax.tick_params(axis="x", rotation=90)
      ax.legend(fontsize=18)
      if y1 == "CEOI":
        ax.set_title("OPEN INTEREST",fontsize=26,fontweight="bold", loc="left", color ='yellow')
      elif y1 == "CCHOI":
        ax.set_title("CHANGE IN OPEN INTEREST",fontsize=24,fontweight="bold", loc="left", color ='yellow')
      ax.grid(axis="y", linestyle=(0, (15, 8)), alpha=0.4) 
      ax.set_axisbelow(True)
      for p in ax.patches:
            ax.annotate(format(p.get_height(), '.0f'),
                        (p.get_x() + p.get_width() / 2., p.get_height()),
                        ha='center', va='center',
                        xytext=(1.5, 4),
                        textcoords='offset points',
                        fontsize=16, fontweight="bold")
fig.tight_layout()
plt.show(block=True)

需要实现:将指定X轴标签(例如STRIKES中的350)设置为自定义颜色和字号,该如何操作?


解决方案

要单独修改某个X轴标签的样式,可通过以下步骤实现:

  • 设置完ax.set_xticks()后,获取所有X轴刻度标签对象
  • 遍历标签列表,匹配目标刻度值对应的标签
  • 为匹配到的标签设置自定义颜色、字号等属性

修改后的完整代码(以将350标签设置为红色、字号28、加粗为例):

import pandas as pd
import matplotlib.pyplot as plt

data = {'PEOI': [190, 105, 100, 150, 100, 170], 'PCHOI': [11, 6, 3, 16, 21, 8], 'STKS': [200, 250, 300, 350, 400, 450], 'CCHOI': [3, 8, 13, 18, 3, 23], 'CEOI': [154, 190, 578, 611, 736, 420]}
df = pd.DataFrame(data)

plt.style.use("dark_background")
fig, axes = plt.subplots(2, 1, figsize=(17,15))
target_strike = 350  # 要修改的目标STRIKES值

for (y1, y2), ax in zip([("CEOI", "PEOI"), ("CCHOI", "PCHOI")], axes):
      ax.bar(df["STKS"], df[y1], width=13, label=y1,color = 'blue')
      ax.bar(df["STKS"], df[y2], width=7, label=y2,color = 'yellow')
      ax.set_xlabel("STRIKES", fontsize=24, fontweight="bold", labelpad=10, color ='cyan')
      ax.set_ylabel("OPEN INTEREST", fontweight="bold", fontsize=24, labelpad=10)
      ax.set_xticks(df["STKS"].values)
      
      # 获取X轴刻度标签并修改目标标签样式
      xtick_labels = ax.get_xticklabels()
      for label in xtick_labels:
          if int(label.get_text()) == target_strike:
              label.set_color('red')
              label.set_fontsize(28)
              label.set_fontweight('bold')
      
      ax.tick_params(labelsize=20)
      ax.tick_params(axis="x", rotation=90)
      ax.legend(fontsize=18)
      if y1 == "CEOI":
        ax.set_title("OPEN INTEREST",fontsize=26,fontweight="bold", loc="left", color ='yellow')
      elif y1 == "CCHOI":
        ax.set_title("CHANGE IN OPEN INTEREST",fontsize=24,fontweight="bold", loc="left", color ='yellow')
      ax.grid(axis="y", linestyle=(0, (15, 8)), alpha=0.4) 
      ax.set_axisbelow(True)
      
      for p in ax.patches:
            ax.annotate(format(p.get_height(), '.0f'),
                        (p.get_x() + p.get_width() / 2., p.get_height()),
                        ha='center', va='center',
                        xytext=(1.5, 4),
                        textcoords='offset points',
                        fontsize=16, fontweight="bold")

fig.tight_layout()
plt.show(block=True)

关键说明

  • 提前定义target_strike变量,方便后续修改目标刻度值
  • 每个X轴标签是Text类型对象,支持set_color()、set_fontsize()、set_fontweight()等样式修改方法
  • 需将标签文本转为整数后与目标值比较,因为标签默认以字符串形式存储

内容的提问来源于stack exchange,提问作者Brijesh Chaurasia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 11:05:11