使用Matplotlib可视化时X轴日期数据显示异常,求代码排查方向
问题描述
使用CSV文件绘制图表时,希望将表格中「시점」列的日期数据作为X轴,但X轴显示异常(日期重叠、排版混乱)。以下是使用的Python代码:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns def get_font_family(): import platform system_name = platform.system() if system_name == "Darwin": font_family = "AppleGothic" elif system_name == "Windows": font_family = "Malgun Gothic" return font_family plt.rc("font", family=get_font_family()) df_price_index = pd.read_csv("/Users/sun/Downloads/품목별_소비자물가지수_품목성질별_2020100__20240626234308.csv", encoding='cp949') df_price = df_price_index[df_price_index["품목별"] == "총지수"].copy() # 총지수 품목만 추출하여 복사본 생성 df_price["전년동월대비"] = df_price["데이터"].pct_change(periods=12) * 100 # 전년 동월 대비 증감률 계산 # print(df_price.dropna()) # 결측값 제거 후 데이터 출력 df_price_notnan = df_price.dropna() print(df_price_notnan) plt.figure(figsize=(10,4)) plt.plot(df_price_notnan['시점'], df_price_notnan['전년동월대비'], marker=".")
问题原因
「시점」列读取后是字符串类型,matplotlib会将其视为普通文本标签,不会识别为日期,因此无法自动优化X轴的排版(比如自动调整显示间隔、旋转标签),导致显示混乱。
解决方案
将「시점」列转换为日期时间类型,让matplotlib识别为日期数据,从而自动优化X轴显示:
- 在清理数据后,添加日期转换代码(根据实际日期格式调整
format参数):
# 假设「시점」列格式为YYYY.MM,转换为日期类型 df_price_notnan['시점'] = pd.to_datetime(df_price_notnan['시점'], format='%Y.%m')
- 绘制图表后,添加X轴标签旋转,进一步优化可读性:
plt.xticks(rotation=45) # 旋转X轴标签45度,避免重叠 plt.tight_layout() # 自动调整布局,防止标签被截断 plt.show() # 显示图表
修改后的完整代码
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns def get_font_family(): import platform system_name = platform.system() if system_name == "Darwin": font_family = "AppleGothic" elif system_name == "Windows": font_family = "Malgun Gothic" return font_family plt.rc("font", family=get_font_family()) df_price_index = pd.read_csv("/Users/sun/Downloads/품목별_소비자물가지수_품목성질별_2020100__20240626234308.csv", encoding='cp949') df_price = df_price_index[df_price_index["품목별"] == "총지수"].copy() # 총지수 품목만 추출하여 복사본 생성 df_price["전년동월대비"] = df_price["데이터"].pct_change(periods=12) * 100 # 전년 동월 대비 증감률 계산 df_price_notnan = df_price.dropna() # 关键修改:转换日期格式 df_price_notnan['시점'] = pd.to_datetime(df_price_notnan['시점'], format='%Y.%m') plt.figure(figsize=(10,4)) plt.plot(df_price_notnan['시점'], df_price_notnan['전년동월대비'], marker=".") # 优化X轴显示 plt.xticks(rotation=45) plt.tight_layout() plt.show()
注意:如果「시점」列日期格式不是
YYYY.MM,需调整format参数,比如YYYYMM对应%Y%m,YYYY-MM对应%Y-%m。
内容的提问来源于stack exchange,提问作者littleBoyyy
相关产品推荐
相关产品推荐

