画各种软件工程图对于程序猿来说是家常便饭。比较简单的结构图、流程图、数据流图、类图、柱状图之类的用Visio、XMind、PowerPoint、Excel也就算了,再复杂一点的,如决策树之类的图,用"亿图"之类的软件也可以将就。更多时候画出既能完美表达思路又线条优美的图却是难上加难。
主要软件:
主要思路:用python的pyecharts画图
搭建python的运行环境,本文选择使用anaconda。
anaconda官网:https://www.anaconda.com/distribution/
对于Mac和Windows一键安装即可,在安装时注意把注册环境变量的选项勾上。打开命令终端后的使用过程各平台都相同。
不过作为一款服务软件,自然首选安装在服务器上,因此,本文以Centos7为例,介绍安装和使用过程。
# 安装依赖包
yum install -y wget tar zip unzip curl bzip2
# 下载安装包
wget https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh
# 安装
bash Anaconda3-2019.03-Linux-x86_64.sh
安装过程中按"空格"跳过声明信息,按提示输入"yes"和"安装目录"后,继续安装步骤,安装过程即可顺利完成。安装完成后,开启一个新的shell终端窗口进行后续操作。
注:为了方便演示才进行如此配置,生产环境请勿执行以下命令。
# 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service
systemctl stop iptables
setenforcing 0
conda install jupyter
# 生成配置文件
jupyter notebook --generate-config
# 设置登录密码
jupyter notebook password
设置密码时连续输入两次密码即可。
pip install pyecharts
jupyter notebook --allow-root --ip=0.0.0.0 --port=8888
访问地址:“http://SERVER_IP:8888”,
密码:上面步骤中设置的密码
详细步骤如下图:
代码:
nodes = [
{
'name': 'category1'},
{
'name': 'category2'},
{
'name': 'category3'},
{
'name': 'category4'},
{
'name': 'category5'},
{
'name': 'category6'},
]
#nodes需要把桑基图中出现的名称全部设置进去,并且要保证links中的名称与name相同
links = [
{
'source': 'category1', 'target': 'category2', 'value': 10},
{
'source': 'category2', 'target': 'category3', 'value': 15},
{
'source': 'category3', 'target': 'category4', 'value': 20},
{
'source': 'category5', 'target': 'category6', 'value': 25}
]
#links代表节点关系,source表示起点,target表示终点,需要将节点关系全部输入进去,value表示节点长度
from pyecharts import options as opts
from pyecharts.charts import Page, Sankey
sankey = Sankey() #可以设置大小和图标名称
sankey.add(
'sankey', #名称
nodes, #输入节点,如果导入json数据,nodes=json['nodes]
links, #输入关系,nodes=json['links']
linestyle_opt=opts.LineStyleOpts(opacity=0.2, curve=0.5, color="source", width=1600),
label_opts=opts.LabelOpts(position="right", is_show=True, color='red'),
node_gap=20
)
sankey.render()
pyecharts不仅仅可以画桑基图,python也不止有pyecharts一种图形库,因此用python画图有很大的发挥空间。尤其是画数学模型相关的图,更是手到擒来。如下:
给大家留一个练习题,下面这张分型图近些年比较火,那么它是如何画的?
代码:
import numpy as np
from PIL import Image
from numba import jit
MAXITERS = 200
RADIUS = 100
@jit
def color(z, i):
v = np.log2(i+1-np.log2(np.log2(abs(z))))/5
if v < 1.0:
return v**4, v**2.5, v
else:
v = max(0, 2-v)
return v, v**1.5, v**3
@jit
def iterate(c):
z = 0j
for i in range(MAXITERS):
if z.real*z.real +z.imag*z.imag > RADIUS:
return color(z, i)
z = z*z + c
return 0, 0, 0
def main(xmin, xmax, ymin, ymax, width, height):
x = np.linspace(xmin, xmax, width)
y = np.linspace(ymax, ymin, height)
z = x[None, :] +y[:, None]*1j
red, green, blue = np.asarray(np.frompyfunc(iterate, 1, 3)(z)).astype(np.float)
img = np.dstack((red, green, blue))
Image.fromarray(np.uint8(img*255)).save('mandelbrot.png')
main(-2.1, 0.8, -1.16, 1.16, 1200, 960)
关注麻辣软硬件,获取更多有料的软硬件知识