Matplotlib散点图X轴日期标签过多,如何减少显示数量?
解决Matplotlib日期X轴标签拥挤的问题
首先明确核心问题:你的日期数据是object类型(字符串格式),Matplotlib会将其当作普通分类数据处理,这就是你之前尝试的定位器方法无效的根本原因。先把日期转换成datetime类型,再配合轴定位器就能轻松解决标签拥挤问题。
方法1:按时间间隔显示标签(推荐)
将日期转为datetime后,用matplotlib.dates中的定位器按年/月等时间间隔设置标签,代码示例:
import matplotlib.pyplot as plt import matplotlib.dates as mdates import pandas as pd # 先把日期列转为datetime类型 df['DATE'] = pd.to_datetime(df['DATE']) x = df.DATE y = df.CLOSE plt.figure(figsize=(21,12)) plt.scatter(x, y) # 获取当前轴对象(无需提前定义ax) ax = plt.gca() # 设置X轴按每年显示一个标签,也可替换为mdates.MonthLocator(interval=6)实现每半年显示 ax.xaxis.set_major_locator(mdates.YearLocator()) # 设置日期显示格式 ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m')) plt.xticks(fontsize=8, rotation=45) plt.show()
方法2:每N个日期显示一个标签
如果需要固定每10个数据点显示一个标签,可以手动设置xticks的索引间隔:
import matplotlib.pyplot as plt import pandas as pd df['DATE'] = pd.to_datetime(df['DATE']) x = df.DATE y = df.CLOSE plt.figure(figsize=(21,12)) plt.scatter(x, y) # 每10个日期取一个标签 interval = 10 plt.xticks(x[::interval], x.dt.strftime('%Y-%m-%d')[::interval], fontsize=8, rotation=45) plt.show()
方法3:限制最多N个标签
用MaxNLocator直接限制X轴标签数量,前提是日期已转为datetime类型:
import matplotlib.pyplot as plt from matplotlib.ticker import MaxNLocator import pandas as pd df['DATE'] = pd.to_datetime(df['DATE']) x = df.DATE y = df.CLOSE plt.figure(figsize=(21,12)) plt.scatter(x, y) ax = plt.gca() # 设置最多显示15个标签,可根据需求调整数值 ax.xaxis.set_major_locator(MaxNLocator(15)) plt.xticks(fontsize=8, rotation=45) plt.show()
关键提示
- 必须先将
object类型的日期转为datetime,否则Matplotlib无法识别为时间序列,所有日期相关的定位器都会失效。 plt.gca()可直接获取当前的轴对象,解决你之前没有axes对象的问题。
内容的提问来源于stack exchange,提问作者AndysPythonStuff
相关产品推荐
相关产品推荐

