Seaborn热力图离散X/Y值绘制问题:Y轴坐标显示异常
问题原因与解决方案
你遇到的问题核心是混淆了Seaborn热力图的Y轴坐标系统和你数据中的实际road_order数值。
Seaborn绘制热力图时,Y轴的坐标是基于你的DataFrame的行索引位置(从0开始,依次对应每一行),而不是road_order列的实际数值。你传入的0.244444444是road_order的某个实际值,但matplotlib的scatter方法需要的是这个值在热力图Y轴上对应的位置索引,而不是数值本身,所以它被当成了坐标值,直接落在了Y轴的最底部(0位置)。
解决步骤
- 先确定你要标记的目标
road_order值对应的行索引位置; - 用这个位置索引作为
scatter的Y坐标参数; - 同时确认X坐标
414确实是目标tod_value对应的列索引位置(如果你的列数足够多,这个是没问题的)。
修改后的代码示例
import pandas as pd import numpy as np import seaborn as sns import matplotlib.pyplot as plt speeds = pd.read_csv('pytest20140730.csv') speedspiv = pd.pivot_table(speeds, values='speed', index='road_order', columns='tod_value', aggfunc=np.mean) speedspiv = speedspiv.sort_index(axis=0, ascending=False) plt.subplots(figsize=(20,15)) ax = sns.heatmap(speedspiv) # 假设你要标记的road_order值是0.244444444,先获取它的行索引位置 target_road_order = 0.244444444 y_pos = speedspiv.index.get_loc(target_road_order) # X坐标414如果是目标tod_value的列索引位置,直接使用 ax.scatter(414, y_pos, marker='*', s=100, color='yellow') plt.show()
额外说明
如果你的road_order是连续数值,且存在索引不匹配的情况(比如索引不是连续的),get_loc仍然能正确找到对应行的位置。如果有多个相同的road_order值,get_loc会返回一个布尔数组,这时你需要根据需求选择对应的行位置。
内容的提问来源于stack exchange,提问作者cdm
相关产品推荐
相关产品推荐

