Matplotlib中如何删除坐标轴原有刻度标签并设置自定义特定标签?
问题描述
我需要在特定刻度位置设置自定义刻度标签,同时删除坐标轴上的原有标签。具体来说,绘制股票收盘价走势图时,x轴显示的是每日日期标签,希望将其删除,替换为每个月对应的标签。尝试删除所有刻度标签并设置新的标签列表,但无法将新标签放置在期望的位置。
数据
| Date | Open | High | Low | Close/Price | Volume |
|---|---|---|---|---|---|
| 6/24/2019 | 86.78 | 87.11 | 86.06 | 86.55 | 1507828 |
| 6/25/2019 | 86.63 | 87.23 | 84.81 | 85.06 | 2481284 |
| 6/26/2019 | 85.38 | 85.81 | 84.75 | 85.33 | 2034693 |
| 6/27/2019 | 85.65 | 86.86 | 85.13 | 86.43 | 1394847 |
| 6/28/2019 | 86.66 | 87.74 | 86.66 | 87.55 | 3025379 |
| 7/1/2019 | 88.84 | 89.72 | 87.77 | 88.45 | 4017249 |
| 7/2/2019 | 89.21 | 90 | 87.95 | 88.87 | 2237183 |
| 7/3/2019 | 89.14 | 91.08 | 89.14 | 90.67 | 1647124 |
原代码
import pandas as pd import matplotlib.pyplot as plt def main(): df = pd.read_excel('DatosUnited.xlsx') date = df['Date'] closePrice = df['Close/Price'] plt.xlabel('Tiempo') plt.ylabel('Valor de las acciones (USD) ') plt.title('Este mes') plt.plot(date, closePrice, 'r') plt.show() main()
解决方案
核心思路是将日期转为可识别的datetime类型,利用Matplotlib的日期定位器和格式化工具,自动或手动指定每月刻度位置并替换标签,同时隐藏原有每日刻度。
自动适配每月刻度的修改代码
import pandas as pd import matplotlib.pyplot as plt from matplotlib.dates import MonthLocator, DateFormatter def main(): df = pd.read_excel('DatosUnited.xlsx') # 将字符串日期转为datetime类型,支持Matplotlib日期处理 df['Date'] = pd.to_datetime(df['Date']) date = df['Date'] closePrice = df['Close/Price'] plt.xlabel('Tiempo') plt.ylabel('Valor de las acciones (USD) ') plt.title('Este mes') plt.plot(date, closePrice, 'r') # 获取当前坐标轴对象 ax = plt.gca() # 设置x轴主刻度为每月第一天 ax.xaxis.set_major_locator(MonthLocator()) # 设置刻度标签格式为「缩写月份+年份」,如"Jun 2019" ax.xaxis.set_major_formatter(DateFormatter('%b %Y')) # 隐藏默认的每日次要刻度 ax.xaxis.set_minor_locator(plt.NullLocator()) # 调整标签角度避免重叠,自动优化布局防止标签截断 plt.xticks(rotation=45) plt.tight_layout() plt.show() main()
手动指定刻度位置的方案(可选)
如果需要自定义刻度位置(比如不是每月第一天),可以手动筛选目标日期的索引:
import pandas as pd import matplotlib.pyplot as plt def main(): df = pd.read_excel('DatosUnited.xlsx') df['Date'] = pd.to_datetime(df['Date']) date = df['Date'] closePrice = df['Close/Price'] plt.xlabel('Tiempo') plt.ylabel('Valor de las acciones (USD) ') plt.title('Este mes') plt.plot(date, closePrice, 'r') ax = plt.gca() # 手动筛选需要作为刻度的日期(示例:每月最后一天) month_ends = df[df['Date'].dt.is_month_end].index # 设置刻度位置为筛选出的日期 ax.set_xticks(df['Date'].iloc[month_ends]) # 设置对应的标签格式 ax.set_xticklabels(df['Date'].iloc[month_ends].dt.strftime('%b %Y')) plt.xticks(rotation=45) plt.tight_layout() plt.show() main()
关键步骤说明
- 日期类型转换:
pd.to_datetime()是基础,确保Matplotlib能正确解析日期并处理刻度。 - 刻度定位与格式化:
MonthLocator()自动识别每月起始点,DateFormatter()可自定义标签格式(如'%Y-%m'表示「年-月」)。 - 隐藏冗余刻度:
NullLocator()移除默认的每日小刻度,只保留需要的月度刻度。 - 布局优化:
rotation和tight_layout()解决标签重叠、截断问题,提升图表可读性。
内容的提问来源于stack exchange,提问作者Adrián Desentis Flores
相关产品推荐
相关产品推荐

