Python3.x下使用Matplotlib为每个散点绘制水平与垂直线的问题
为Matplotlib散点添加水平和垂直线的解决方案
你可以通过Matplotlib的plt.vlines()和plt.hlines()函数轻松实现这个需求,这两个函数支持批量处理坐标数组,效率很高。下面分几种常见场景给你演示:
场景1:绘制从坐标轴到散点的十字线
这是最常用的需求,线条从x轴/y轴延伸到对应散点的位置,能清晰标注每个点的坐标位置:
import matplotlib.pyplot as plt x = [-0.9, 0.5 , -2.5, 3 , -1.5 ] y = [2.9 , -1.5 , 1 , 1 , -2.4 ] v = [50 , 33 , 21 , 18 , 5 ] fig = plt.figure(figsize=(10, 8)) plt.scatter(x,y, s=40 ,marker='o', c='black') # 绘制垂直线:从y轴底部延伸到散点的y坐标 plt.vlines(x=x, ymin=plt.ylim()[0], ymax=y, colors='gray', linestyles='--', linewidth=0.8) # 绘制水平线:从x轴左侧延伸到散点的x坐标 plt.hlines(y=y, xmin=plt.xlim()[0], xmax=x, colors='gray', linestyles='--', linewidth=0.8) plt.grid() plt.show()
这里plt.ylim()[0]会自动获取当前y轴的最小值,plt.xlim()[0]获取x轴最小值,确保线条精准对齐到坐标轴。你可以调整colors(颜色)、linestyles(线型)和linewidth(线宽)来匹配你的可视化风格。
场景2:绘制贯穿整个绘图区域的垂直线/水平线
如果你想要线条穿过整个绘图区域(比如从顶部到底部的垂直线、从左到右的水平线),只需要把终点设为轴的另一端极值即可:
import matplotlib.pyplot as plt x = [-0.9, 0.5 , -2.5, 3 , -1.5 ] y = [2.9 , -1.5 , 1 , 1 , -2.4 ] v = [50 , 33 , 21 , 18 , 5 ] fig = plt.figure(figsize=(10, 8)) plt.scatter(x,y, s=40 ,marker='o', c='black') # 贯穿整个区域的垂直线 plt.vlines(x=x, ymin=plt.ylim()[0], ymax=plt.ylim()[1], colors='red', linestyles=':', linewidth=1) # 贯穿整个区域的水平线 plt.hlines(y=y, xmin=plt.xlim()[0], xmax=plt.xlim()[1], colors='red', linestyles=':', linewidth=1) plt.grid() plt.show()
场景3:根据额外数据自定义线条样式
如果你的v值需要用来区分线条(比如颜色、宽度),可以用循环逐个绘制,灵活控制每个线条的属性:
import matplotlib.pyplot as plt x = [-0.9, 0.5 , -2.5, 3 , -1.5 ] y = [2.9 , -1.5 , 1 , 1 , -2.4 ] v = [50 , 33 , 21 , 18 , 5 ] fig = plt.figure(figsize=(10, 8)) plt.scatter(x,y, s=40 ,marker='o', c='black') # 用v值映射渐变颜色 norm = plt.Normalize(min(v), max(v)) cmap = plt.cm.viridis # 可替换为你喜欢的配色方案 for xi, yi, vi in zip(x, y, v): line_color = cmap(norm(vi)) # 绘制垂直线 plt.vlines(xi, ymin=plt.ylim()[0], ymax=yi, color=line_color, linewidth=1.5) # 绘制水平线 plt.hlines(yi, xmin=plt.xlim()[0], xmax=xi, color=line_color, linewidth=1.5) plt.grid() plt.show()
这样线条颜色会随着v值的大小渐变,让你的可视化更有信息量。
内容的提问来源于stack exchange,提问作者azeez
相关产品推荐
相关产品推荐

