需求说明

有时候,我们需要对一张图片进行坐标轴绘制,直观观察图片的长宽分布,并根据坐标轴中心点的选取来实现不同位置的坐标轴。
常见需求:

  • 中心点自定义
  • 坐标间隔自定义
  • 坐标轴颜色自定义
  • 透明度自定义
  • 间隔值大小自定义以及颜色自定义
  • 图片自定义

因此,本博客就以上需求进行代码实现,具体效果如下:
原图:

绘制坐标轴后的图:

实现代码

主要操作讲解都在代码中注释了,可以边看边食用!

依赖的库

from matplotlib import pyplot as plt
import os# 设置图片保存的分辨率
plt.rcParams['savefig.dpi'] = 200

主要函数

def patch_arrow(img_path, center, limits=None, interval=6, color='r', width=2, fontsize=7, fontcolor='black', alpha=0.5):'''img_path: 图片路径center: 中心坐标limits: 坐标轴间隔大小——默认为None, 表示自动求取间隔interval: 间隔标记的长度color: 坐标轴颜色width: 线条宽度fontsize: 坐标间隔的字体大小fontcolor: 间隔字体颜色alpha: 透明度--值越大,透明度越小'''# 判断输入条件是否满足基本要求assert os.path.isfile(img_path), \'please enter a truthful img_path, now it dosen`t exist.'assert len(center)==2, \'please enter center like (x, y).'assert alpha <= 1.0 and alpha >= 0., \'please enter alpha like (from 0. to 1.).'img = plt.imread(img_path)    # 读取图像h,w,_ = img.shape             # 获取高宽# 自动确定间隔auto_limit_numbers = 12  # 自动间隔点if limits is None:limits = max((h, w))limits = limits // auto_limit_numbersfig = plt.figure(figsize=(w/100,h/100))x, y = center[0], center[1]# 判断输入的中心点坐标是否超出图片区域assert x < w and y < h, \'please enter a truethful center position, which must limit in (x < w, y < h).'# 计算中心的点到图像左右两边的距离——即中心点左右两边允许的绘图区域to_w_left = x  to_w_right = (w-1) - x  # (w-1):图片布局是从0到w-1,所以x最大值为w-1# 计算中心的点到图像上下两边的距离——即中心点左右两边允许的绘图区域to_h_up = yto_h_down = (h-1) - y# 计算绘制图像时的偏移值--受限于widthx_offset = width / 2  # 用于绘制x轴等图像时的一个偏移值,用于修正绘图y_offset = width / 2  # 用于修正y轴相关绘图# 展示图片plt.imshow(img)plt.axis('off') # 关闭坐标轴# 绘制x, y轴# 绘制x轴,保持y不变# 绘制y轴,保持x不变# head_width: 箭头大小# width: 线宽plt.arrow(x=0, y=y-y_offset, dy=0, dx=w-1, color=color, width=width, alpha=alpha, length_includes_head=True, head_width=5*width)  # x 轴plt.arrow(x=x-x_offset, y=h-1, dy=-h+1, dx=0, color=color, width=width, alpha=alpha, length_includes_head=True, head_width=5*width)  # y 轴# 制作x轴坐标间隔--根据limit去求解存在的间隔to_w_left_star = []  # 制作x轴的左轴--包含0值--即原点信息for i in range(0, to_w_left+1, limits):to_w_left_star.append(i)to_w_right_star = [] # 制作x轴的右轴--包含0值--即原点信息for i in range(0, to_w_right+1, limits):to_w_right_star.append(i)# 制作y轴坐标间隔to_h_up_star = []  # 上轴--包含0值--即原点信息for i in range(0, to_h_up+1, limits):to_h_up_star.append(i)to_h_down_star = []  # 下轴--包含0值--即原点信息for i in range(0, to_h_down+1, limits):to_h_down_star.append(i)# 绘制各轴的间隔# 之所以每一个遍历都带入一个0值判断,是为了保证循环结构的一致性,因为如果从索引1开始,当某一个轴一边不满足间隔,就会导致遍历无法进行for i in to_w_left_star[:]:   # x 左轴if i == 0:  # 跳过零点continue# 绘制坐标轴间隔线条plt.plot((x-i, x-i), (y-y_offset, y-y_offset-interval), color=color, alpha=alpha, linewidth=width-2 if width-2>0 else 1)# 绘制坐标轴间隔的值# x, y经过调整,默认参数下显示较为良好# 如果自定义字体过大,可能存在一定的偏移,不会很影响显示效果plt.text(x=x-i-0.1*limits, y=y+0.35*limits, s='{0:d}'.format(-i), fontsize=fontsize, color=fontcolor)for i in to_w_right_star[:]:  # x 右轴if i == 0:continueplt.plot((x+i, x+i), (y-y_offset, y-y_offset-interval), color=color, alpha=alpha, linewidth=width-2 if width-2>0 else 1)plt.text(x=x+i-0.1*limits, y=y+0.35*limits, s='{0:d}'.format(i), fontsize=fontsize, color=fontcolor)for i in to_h_up_star[:]:   # y 上轴if i == 0:continueplt.plot((x-x_offset, x-x_offset+interval), (y-i, y-i), color=color, alpha=alpha, linewidth=width-2 if width-2>0 else 1)plt.text(x=x+0.15*limits, y=y-i+0.1*limits, s='{0:d}'.format(i), fontsize=fontsize, color=fontcolor)for i in to_h_down_star[:]:  # y 下轴if i == 0:continueplt.plot((x-x_offset, x-x_offset+interval), (y+i, y+i), color=color, alpha=alpha, linewidth=width-2 if width-2>0 else 1)plt.text(x=x+0.15*limits, y=y+i+0.1*limits, s='{0:d}'.format(-i), fontsize=fontsize, color=fontcolor)plt.text(x=x+0.1*limits, y=y+0.35*limits, s='0', fontsize=fontsize,color=fontcolor)  # 原点标定绘制# 保存修改后的图片# bbox_inches='tight': 去掉白边——原坐标轴的占位fig.savefig('test.png',bbox_inches='tight')

示例

img_path = 'fst.jpg'  # 自行修改# img_path: 图片路径
# center:坐标轴中心点
# limits:是否自定设置间隔--None为自动,可以自行调节大小(int/float)
# limits——设置不恰当可能出现坐标轴间隔值的重叠情况
# interval:间隔直线的高度
# color:坐标轴颜色
# width:坐标轴粗细
# fontsize:坐标轴间隔值的大小
# fontcolor:坐标轴字体颜色
# alpha:透明度
patch_arrow(img_path, center=[200, 200], limits=None, interval=12, color='r', width=3, fontsize=20, fontcolor='r', alpha=0.6)

result:

如果对你有帮助,不妨点赞关注一下吧!(●’◡’●)

为图片绘制带箭头的坐标轴相关推荐

  1. Matlab如何绘制带箭头图形

    Matlab如何绘制带箭头图形 带箭头坐标轴 带箭头曲线 实例演示 例1 带箭头曲线 例2 带箭头曲线+带箭头坐标轴 联系作者 带箭头坐标轴 前段时间推出了绘制箭头坐标轴曲线的方法,许多网友联系我索取 ...

  2. Android Canvas绘制带箭头的直线

    先看下效果图: 下面我们直接看代码 我自定义了一个View,代码如下: package com.davis.drawtrangle;import android.content.Context; im ...

  3. Matlab任意两点之间绘制带箭头的直线

    Matlab任意两点之间绘制带箭头的直线 简单绘制任意两点之间.本来不想自己写的,可是网上的代码用起来不舒服,所以简单看看原理,原来就是个坐标变换而已.索性自己写了一份,分享如下: function ...

  4. Echarts绘制带箭头的线

    Echarts绘制带箭头的线 这个图主要参考echarts官网的关系图绘制的,难点在于去掉其余导向图的箭头,只保留最后一个节点的箭头,以及处理值为null时箭头的指向问题,代码如下: <temp ...

  5. R语言使用rnorm函数生成正太分布数据、使用plot函数可视化折线图、使用arrows函数在可视化图像中绘制箭头曲线、绘制带箭头线段,可以设置箭头角度,有几个箭头(1起点箭头、2终点箭头,3双箭头)

    R语言使用rnorm函数生成正太分布数据.使用plot函数可视化折线图.使用arrows函数在可视化图像中绘制箭头曲线.绘制带箭头线段,可以设置箭头角度,有几个箭头(1起点箭头.2终点箭头,3双箭头) ...

  6. WebGL绘制带箭头贴图的线

    示例 在讲述本文内容之前,我希望读者先具备以下知识点: 了解WebGL的基本知识,懂得调用自定义的Shader程序: 基本的数学基础和空间几何知识: 明白GPU的渲染管线流程: 因为,本文内容主要讲述 ...

  7. matplot 坐标点_matplot绘制带箭头的坐标图

    最近在写论文,遇到一些函数图像需要自己画,在matplot官网上找到一个例子,在此基础上进行修改. from mpl_toolkits.axisartist.axislines import Subp ...

  8. opencv之绘制带箭头的线段---arrowedLine

    核心函数 arrowedLine(img, pt1, pt2, color, thickness=None, line_type=None, shift=None, tipLength=None) i ...

  9. Canvas 教程:如何绘制带箭头的曲线

    这篇文章要解决一个问题,就是给定 HTML 中任意一个点(起点)和另一个点(终点),绘制一条带箭头的曲线. 废话不多说,直奔主题. 我们只有两个点的相对偏移量(offset),思路就是以这两个点作为对 ...

最新文章

  1. 面试官:说说Spring Cloud底层原理?
  2. zabbix监控haproxy
  3. python要在哪里写代码-如何更优雅地写python代码
  4. 莱特准则 matlab,初学MATLAB,遇到一简单的题目,一点头绪也没有啊.99
  5. boost::sort模块float_sort 右移函子排序示例
  6. MySQL 删除视图
  7. python协程与多线程比较_python-协程、多线程、多进程性能比较
  8. pip install -r requirements.txt 超时解决方案
  9. Bellman-ford算法与Dijkstra算法(RIP和OSPF的基本算法)
  10. 记录小米fastboot刷机遇到的驱动问题
  11. NetSuite 精益实施的ALV实践
  12. matlab 求卡方值,谁能用spss或者sas帮我做一个统计数据分析 ,求出卡方值和P值。谢谢!急需!!!!...
  13. 安卓游戏《罗马帝国》游戏心得
  14. 2022必看花展 IFEX昆明国际花卉园艺展,新展期11月11-13日
  15. ArrayList和LinkedList时间、空间复杂度对比
  16. php获取汉字的首字母,php获取汉字拼音首字母的方法
  17. 风林评《解读基金,我的投资观与实践》|你怎么能不知道基金投资的三个思想...
  18. Google Pixel 2 首次现身:或首发安卓 8.0
  19. 计算机机房接地方案,机房防雷接地系统设计方案.doc
  20. 2020秋招——XX校招笔试编程题:回文串

热门文章

  1. Loj #2529. 「ZJOI2018」胖
  2. javascript float转int
  3. php数组分开_PHP 合并数组
  4. Java语言程序设计 :医院简易挂号管理系统 Java实验
  5. python实现秒杀系统_如何设计一个秒杀系统
  6. 基于RK3399+FPGA的地面测试台多参数数据记录仪方案(一)硬件设计
  7. HTML期末学生大作业(9套)html+css+javascript仿京东、天猫、服装、各大电商模板(大学毕业设计)
  8. 天纵智能软件快速开发平台主次表数据管理插件
  9. Haar特征级联分类器的训练与检测
  10. 2020校招求职学习笔记