程序猿如何画出精美的桑基图

画各种软件工程图对于程序猿来说是家常便饭。比较简单的结构图、流程图、数据流图、类图、柱状图之类的用Visio、XMind、PowerPoint、Excel也就算了,再复杂一点的,如决策树之类的图,用"亿图"之类的软件也可以将就。更多时候画出既能完美表达思路又线条优美的图却是难上加难。

文章目录

      • 安装配置
        • 环境介绍
        • 安装anaconda
        • 配置操作系统
        • 安装jupyter notebook
        • 配置jupyter
        • 安装图形库
      • 画图
        • 启动jupyter notebook
        • 用代码画图
      • 结语

最近看了一篇ceph大神的博客,用桑基图描述crush(一种分布式文件系统的副本分布策略),既形象又优美,那么怎么才能画出这种图呢?
程序猿如何画出精美的桑基图_第1张图片
原文地址: http://www.zphj1987.com/2019/03/08/ceph-pg-crush-fast-check/#more
答案:用代码画,虽然有时候会费点劲儿,但有更大的发挥空间。

安装配置

环境介绍

主要软件:

  • anaconda2019.03
  • jupyter notebook
  • pyecharts
  • Linux/Mac/Windows

主要思路:用python的pyecharts画图

搭建python的运行环境,本文选择使用anaconda。

anaconda官网:https://www.anaconda.com/distribution/

对于Mac和Windows一键安装即可,在安装时注意把注册环境变量的选项勾上。打开命令终端后的使用过程各平台都相同。

不过作为一款服务软件,自然首选安装在服务器上,因此,本文以Centos7为例,介绍安装和使用过程。

安装anaconda

# 安装依赖包
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

安装jupyter notebook

conda install jupyter

配置jupyter

# 生成配置文件
jupyter notebook --generate-config
# 设置登录密码
jupyter notebook password

设置密码时连续输入两次密码即可。

安装图形库

pip install pyecharts

画图

启动jupyter notebook

jupyter notebook --allow-root --ip=0.0.0.0 --port=8888

用代码画图

访问地址:“http://SERVER_IP:8888”,
密码:上面步骤中设置的密码
详细步骤如下图:
程序猿如何画出精美的桑基图_第2张图片
代码:

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画图有很大的发挥空间。尤其是画数学模型相关的图,更是手到擒来。如下:
程序猿如何画出精美的桑基图_第3张图片
给大家留一个练习题,下面这张分型图近些年比较火,那么它是如何画的?
程序猿如何画出精美的桑基图_第4张图片
代码:

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)

关注麻辣软硬件,获取更多有料的软硬件知识

你可能感兴趣的:(人工智能,桑基图,画法,python,pyecharts)