虽然我不知道题目中的图片是拿啥的画的,
但我知道,用Python&Matplotlib是可以实现的。
话不多说,先展示一下我用Matplotlib画出来的结果(cover 题目中的图一)利用Matplotlib复刻出的图一
优点①:精准的几何学:每一个元素的位置、大小、角度都是完全定量的,可以保证元素间的间距均匀等。轻松添加格点、参考线
优点②:高度定制:原图中的弧线箭头看起来并不完美,看起来像是用钢笔之类的工具实现的。然而用代码可以画出一段完美的圆弧,使得被连接的两个圆心、弧线共圆。图一左下角的弧线箭头
优点③:整体调整比较容易,比如修改图形的长宽比、字体字号。(这一点我做的不太好,其实代码里应该把各个元素的属性统一用一个变量表示)
缺点①:不易上手(好在Matplotlib官方文档比较齐全)。
缺点②:比较耗费时间,写代码是一方面,计算那堆交点啥的也蛮费时间的。
缺点③:Matplotlib的某些功能仍不完善...(说的就是你,Anotate)
Code如下,有兴趣的同学可以自己试试。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as mpatches
plt.subplots_adjust(left=0.00, bottom=0.0, right=1.00, top=0.95, wspace=0.0, hspace=0.00)
def hexagon_with_text(ax,x,y,text,size,**kwargs):
xy=np.array([x,y])
hexagon = mpatches.RegularPolygon(xy, 6, radius=size,facecolor=#5472bb,edgecolor=#3f597c, orientation=np.pi / 2)
ax.add_patch(hexagon)
ax.text(xy[0],xy[1],text,fontsize=size*14,color=white,va=center,ha=center)
def circle_with_text(ax,x,y,text,size,**kwargs):
xy=np.array([x,y])
circle = mpatches.Circle(xy, radius=size,facecolor=#83aa51,edgecolor=#546538)
ax.add_patch(circle)
ax.text(xy[0],xy[1],text,fontsize=size*14,color=white,va=center,ha=center)
def arrow(ax,x,y,size,**kwargs):
ax.plot(x,y,**kwargs)
theta=np.arctan2(x[1]-x[0],y[1]-y[0])
xy=np.array([x[1]-size*np.sin(theta),y[1]-size*np.cos(theta)])
triangle = mpatches.RegularPolygon(xy, 3, radius=size,color=kwargs[color], orientation=-theta)
ax.add_patch(triangle)
def arrow_with_rad(ax,x,y,r