python生成图表
# 必须放在所有import最顶部!解决MKL/PIL加载卡死 import os os.environ["MKL_THREADING_LAYER"] = "GNU" # 禁用PIL部分加速,避免中断 os.environ["PILLOW_NO_JPEG2000"] = "1" import matplotlib.pyplot as plt import pandas as pd from io import StringIO import matplotlib.dates as mdates # ---------------------- 完整数据内置 ---------------------- data_text = """净值日期 单位净值 累计净值 2025/12/29 0.9556 0.9556 2025/12/30 0.9595 0.9595 2025/12/31 0.9274 0.9274 2026/1/1 0.9274 0.9274 2026/1/2 0.9274 0.9274 2026/1/3 0.9274 0.9274 2026/1/4 0.9274 0.9274 2026/1/5 0.9587 0.9587 2026/1/6 0.9758 0.9758 2026/1/7 1.0108 1.0108 2026/1/8 0.9959 0.9959 2026/1/9 1.0130 1.0130 2026/1/10 1.0130 1.0130 2026/1/11 1.0130 1.0130 2026/1/12 1.0391 1.0391 2026/1/13 1.0092 1.0092 2026/1/14 1.0292 1.0292 2026/1/15 1.0151 1.0151 2026/1/16 1.0456 1.0456 2026/1/17 1.0456 1.0456 2026/1/18 1.0456 1.0456 2026/1/19 1.0620 1.0620 2026/1/20 1.0571 1.0571 2026/1/21 1.0749 1.0749 2026/1/22 1.0862 1.0862 2026/1/23 1.0872 1.0872 2026/1/24 1.0872 1.0872 2026/1/25 1.0872 1.0872 2026/1/26 1.0692 1.0692 2026/1/27 1.0927 1.0927 2026/1/28 1.0776 1.0776 2026/1/29 1.0536 1.0536 2026/1/30 1.0842 1.0842 2026/1/31 1.0842 1.0842 2026/2/1 1.0842 1.0842 2026/2/2 0.9944 0.9944 2026/2/3 1.0638 1.0638 2026/2/4 1.0405 1.0405 2026/2/5 1.0124 1.0124 2026/2/6 0.9921 0.9921 2026/2/7 0.9921 0.9921 2026/2/8 0.9921 0.9921 2026/2/9 1.0556 1.0556 2026/2/10 1.0287 1.0287 2026/2/11 1.0330 1.0330 2026/2/12 1.0870 1.0870 2026/2/13 1.0967 1.0967 2026/2/14 1.0967 1.0967 2026/2/15 1.0967 1.0967 2026/2/16 1.0967 1.0967 2026/2/17 1.0967 1.0967 2026/2/18 1.0967 1.0967 2026/2/19 1.0967 1.0967 2026/2/20 1.0967 1.0967 2026/2/21 1.0967 1.0967 2026/2/22 1.0967 1.0967 2026/2/23 1.0967 1.0967 2026/2/24 1.1248 1.1248 2026/2/25 1.1642 1.1642 2026/2/26 1.1967 1.1967 2026/2/27 1.2190 1.2190 2026/2/28 1.2190 1.2190 2026/3/1 1.2190 1.2190 2026/3/2 1.2350 1.2350 2026/3/3 1.1522 1.1522 2026/3/4 1.1110 1.1110 2026/3/5 1.2077 1.2077 2026/3/6 1.2628 1.2628 2026/3/7 1.2628 1.2628 2026/3/8 1.2628 1.2628 2026/3/9 1.2131 1.2131 2026/3/10 1.2723 1.2723 2026/3/11 1.2226 1.2226 2026/3/12 1.1750 1.1750 2026/3/13 1.1281 1.1281 2026/3/14 1.1281 1.1281 2026/3/15 1.1281 1.1281 2026/3/16 1.1398 1.1398 2026/3/17 1.0404 1.0404 2026/3/18 1.0824 1.0824 2026/3/19 1.0067 1.0067 2026/3/20 0.9817 0.9817 2026/3/21 0.9817 0.9817 2026/3/22 0.9817 0.9817 2026/3/23 0.9039 0.9039 2026/3/24 0.9423 0.9423 2026/3/25 0.9627 0.9627 2026/3/26 0.9261 0.9261 2026/3/27 0.9212 0.9212 2026/3/28 0.9212 0.9212 2026/3/29 0.9212 0.9212 2026/3/30 0.9142 0.9142 2026/3/31 0.8867 0.8867 2026/4/1 0.9392 0.9392 2026/4/2 0.9065 0.9065 2026/4/3 0.9159 0.9159 2026/4/4 0.9159 0.9159 2026/4/5 0.9159 0.9159 2026/4/6 0.9159 0.9159 2026/4/7 0.9196 0.9196 2026/4/8 1.0605 1.0605 2026/4/9 1.0721 1.0721 2026/4/10 1.1310 1.1310 2026/4/11 1.1310 1.1310 2026/4/12 1.1310 1.1310 2026/4/13 1.1597 1.1597 2026/4/14 1.1981 1.1981 2026/4/15 1.2265 1.2265 2026/4/16 1.2759 1.2759 2026/4/17 1.3194 1.3194 2026/4/18 1.3194 1.3194 2026/4/19 1.3194 1.3194 2026/4/20 1.3061 1.3061 2026/4/21 1.2973 1.2973 2026/4/22 1.3597 1.3597 2026/4/23 1.3377 1.3377 2026/4/24 1.3256 1.3256 2026/4/25 1.3256 1.3256 2026/4/26 1.3256 1.3256 2026/4/27 1.3349 1.3349 2026/4/28 1.3163 1.3163 2026/4/29 1.3280 1.3280 2026/4/30 1.3860 1.3860 2026/5/1 1.3860 1.3860 2026/5/2 1.3860 1.3860 2026/5/3 1.3860 1.3860 2026/5/4 1.3860 1.3860 2026/5/5 1.3860 1.3860 2026/5/6 1.5640 1.5640 2026/5/7 1.6581 1.6581 2026/5/8 1.7008 1.7008 2026/5/9 1.7008 1.7008 2026/5/10 1.7008 1.7008 2026/5/11 1.8202 1.8202 2026/5/12 1.8536 1.8536 2026/5/13 1.9544 1.9544 2026/5/14 1.9020 1.9020 2026/5/15 1.7750 1.7750 2026/5/16 1.7750 1.7750 2026/5/17 1.7750 1.7750 2026/5/18 1.7627 1.7627 2026/5/19 1.7448 1.7448 2026/5/20 1.7470 1.7470 2026/5/21 1.7141 1.7141 2026/5/22 1.8009 1.8009 2026/5/23 1.8009 1.8009 2026/5/24 1.8009 1.8009 2026/5/25 1.8444 1.8444 2026/5/26 1.8923 1.8923 2026/5/27 1.9985 1.9985 2026/5/28 2.0738 2.0738 2026/5/29 2.0292 2.0292 2026/5/30 2.0292 2.0292 2026/5/31 2.0292 2.0292 2026/6/1 2.0026 2.0026 2026/6/2 2.0010 2.0010 2026/6/3 2.0149 2.0149 2026/6/4 2.0355 2.0355 2026/6/5 1.8362 1.8362 2026/6/6 1.8362 1.8362 2026/6/7 1.8362 1.8362 2026/6/8 1.7505 1.7505 2026/6/9 1.8973 1.8973 2026/6/10 1.7938 1.7938 2026/6/11 1.8920 1.8920 2026/6/12 1.8520 1.8520 2026/6/13 1.8520 1.8520 2026/6/14 1.8520 1.8520 2026/6/15 2.0506 2.0506 2026/6/16 2.0812 2.0812 2026/6/17 2.2198 2.2198 2026/6/18 2.3938 2.3938 2026/6/19 2.3938 2.3938 2026/6/20 2.3938 2.3938 2026/6/21 2.3938 2.3938 2026/6/22 2.6737 2.6737 2026/6/23 2.3590 2.3590 2026/6/24 2.4849 2.4849 2026/6/25 2.7376 2.7376""" # 读取文本数据 df = pd.read_csv(StringIO(data_text), sep="\t") # 转换日期格式 df["净值日期"] = pd.to_datetime(df["净值日期"]) # ---------------------- 绘图配置 ---------------------- plt.rcParams["font.family"] = ["SimHei"] plt.rcParams["axes.unicode_minus"] = False # 加宽画布容纳更多日期 fig, ax = plt.subplots(figsize=(16, 8), dpi=120) # 单位净值灰色线,累计净值红色线 ax.plot(df["净值日期"], df["单位净值"], color="#707070", linewidth=2, label="单位净值") ax.plot(df["净值日期"], df["累计净值"], color="#D82020", linewidth=2.2, label="累计净值") # Y轴范围 ax.set_ylim(0.5, 2.8) # 横向网格 ax.grid(axis="y", color="#dddddd", linestyle="-") # ========== 核心修改:增加日期刻度密度 ========== # 主刻度:每10天显示 ax.xaxis.set_major_locator(mdates.DayLocator(interval=10)) # 次刻度:每5天显示(不标注文字,仅短刻度线) ax.xaxis.set_minor_locator(mdates.DayLocator(interval=5)) # 日期格式:月/日 ax.xaxis.set_major_formatter(mdates.DateFormatter("%m/%d")) # 缩小字体、加大旋转避免重叠 plt.xticks(rotation=70, ha="right", fontsize=8) # 手动指定所有X轴刻度日期 import matplotlib.dates as mdates from datetime import datetime xtick_dates = [ datetime(2025,12,29), datetime(2026,1,8), datetime(2026,1,18), datetime(2026,1,28), datetime(2026,2,7), datetime(2026,2,17), datetime(2026,2,27), datetime(2026,3,9), datetime(2026,3,19), datetime(2026,3,29), datetime(2026,4,8), datetime(2026,4,18), datetime(2026,4,28), datetime(2026,5,8), datetime(2026,5,18), datetime(2026,5,28), datetime(2026,6,7), datetime(2026,6,17) ] # 绑定刻度与格式 ax.set_xticks(xtick_dates) ax.xaxis.set_major_formatter(mdates.DateFormatter("%Y年%m月%d日")) plt.xticks(rotation=65, ha="right", fontsize=9) # 图例 ax.legend(loc="upper left", frameon=False, fontsize=11) # 隐藏上边、右边边框 ax.spines["top"].set_visible(False) ax.spines["right"].set_visible(False) ax.set_xlabel("净值日期", fontsize=12) ax.set_ylabel("净值", fontsize=12) ax.set_title("", fontsize=14, pad=15) plt.tight_layout() # 保存图片 plt.savefig("基金净值走势图_多日期.png") plt.show()