如何用Seaborn在同图绘制双柱状图与双折线图(适配双周Y值)
用Seaborn绘制双柱状图+双折线图的同图可视化(适配双周数据对应月度X轴)
没问题,我来帮你搞定这个可视化需求!首先咱们得明确数据对应关系:X轴是12个月度标签,但所有Y轴数据(temp_1/temp_2/kw_1/kw_2)都是24个双周数据,也就是每个月对应2个双周数据点。接下来直接上可运行的代码,每一步我都会给你解释清楚:
import seaborn as sns import matplotlib.pyplot as plt import numpy as np # 你的原始数据 month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'June', 'July', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] temp_1 = [35, 45, 55, 65, 75, 85, 95, 100, 85, 65, 45, 35, 55, 65, 75, 85, 95, 100, 35, 45, 55, 65, 75, 85,] temp_2 = [30, 35, 65, 55, 70, 85, 65, 85, 85, 75, 65, 75, 65, 85, 85, 75, 65, 75, 85, 85, 75, 65, 75, 65,] kw_1 = [5, 23, 5 , 6, 6, 10, 3, 0 , 1, 4, 5, 23, 5 , 6, 3, 1, 6, 10, 3, 0, 0 , 1, 4, 8] kw_2 = [6, 6, 10, 3, 0 , 1, 4, 6, 10, 3, 0, 6, 10, 3, 0, 5, 23, 5 , 6, 5, 23, 5 , 1, 25 ] # 计算峰值及对应索引 peak_1 = max(kw_1) peak_index_1 = kw_1.index(peak_1) peak_2 = max(kw_2) peak_index_2 = kw_2.index(peak_2) # 1. 准备X轴位置:24个双周数据对应0-23的位置 x = np.arange(len(temp_1)) # 月度标签的位置:每个月两个数据点的中间(比如Jan的两个点在0和1,标签放在0.5的位置) month_positions = np.arange(0.5, len(temp_1), 2) # 2. 创建画布和双Y轴 fig, ax1 = plt.subplots(figsize=(12, 6)) ax2 = ax1.twinx() # 创建共享X轴的第二个Y轴,用来画折线图 # 3. 绘制两个柱状图(温度数据) bar_width = 0.35 sns.barplot(x=x, y=temp_1, width=bar_width, ax=ax1, color='skyblue', label='temp_1') sns.barplot(x=x + bar_width, y=temp_2, width=bar_width, ax=ax1, color='lightcoral', label='temp_2') # 4. 绘制两个折线图(KW数据) sns.lineplot(x=x + bar_width/2, y=kw_1, ax=ax2, marker='o', color='darkblue', label='kw_1', linewidth=2) sns.lineplot(x=x + bar_width/2, y=kw_2, ax=ax2, marker='s', color='darkred', label='kw_2', linewidth=2) # 5. 标注峰值 ax2.annotate(f'Peak: {peak_1}', xy=(peak_index_1 + bar_width/2, peak_1), xytext=(peak_index_1 + bar_width/2 + 1, peak_1 + 2), arrowprops=dict(arrowstyle='->', color='darkblue', lw=1.5)) ax2.annotate(f'Peak: {peak_2}', xy=(peak_index_2 + bar_width/2, peak_2), xytext=(peak_index_2 + bar_width/2 + 1, peak_2 + 2), arrowprops=dict(arrowstyle='->', color='darkred', lw=1.5)) # 6. 调整X轴刻度和标签 ax1.set_xticks(month_positions) ax1.set_xticklabels(month, fontsize=12) ax1.set_xlabel('Month', fontsize=12) # 7. 设置Y轴标签和样式 ax1.set_ylabel('Temperature', fontsize=12, color='gray') ax1.tick_params(axis='y', labelcolor='gray') ax2.set_ylabel('KW Value', fontsize=12, color='dimgray') ax2.tick_params(axis='y', labelcolor='dimgray') # 8. 合并图例并设置标题 lines1, labels1 = ax1.get_legend_handles_labels() lines2, labels2 = ax2.get_legend_handles_labels() ax1.legend(lines1 + lines2, labels1 + labels2, loc='upper left', fontsize=10) plt.title('Bi-weekly Temperature & KW Data Overview', fontsize=14, pad=20) # 调整布局防止标签被截断 plt.tight_layout() plt.show()
关键细节说明:
- 双Y轴设计:用
ax1画柱状图(温度数据),ax2画折线图(KW数据),避免不同量级数据互相干扰 - X轴位置调整:每个月的两个双周数据用并排柱状展示,月度标签放在两个柱子的中间,视觉上更清晰
- 峰值标注:用
annotate配合箭头精准标注出两个KW数据的峰值,直观突出关键信息 - 样式优化:通过颜色区分不同系列,添加标记点和加粗折线让折线图更醒目
内容的提问来源于stack exchange,提问作者user9469766
相关产品推荐
相关产品推荐

