用 Python 绘制现金流量图

2023-10-14 20:50
文章标签 python 绘制 现金流量

本文主要是介绍用 Python 绘制现金流量图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

警告:本文是作者早期的博客,内容有诸多不严谨。现已重写。

重写的文章在这个链接的位置:用 Python 绘制现金流量图 (重置版)

请点击链接访问新的文章地址。

以下内容参考价值有限。

最近在学习工程经济学,经常要绘制现金流量图。希望能用 Python 更方便地绘制现金流量图。虽然不知道这样到底是不是很意义。

1. 根据现金流量表绘制现金流量图

假设现在有如下现金流量表:

项目 – t年

0

1

2

3

4

5

6

投资

600

收入

350

350

450

450

450

450

经营成本

200

200

250

250

250

250

希望根据这一现金流量表绘制相应的先进流量图。

代码如下:



"""    绘制资金流量图    """" 颜色设置 "
arrow_color = 'black'
axis_color  = 'black'
title_color = 'black'' 导入相应的库 '
import matplotlib.pyplot as plt
import numpy as np' 设置绘图标题 '
plt.title("现金流量图", c=title_color)
plt.ylabel("资金(万元)")' 设置初始变量值 '
# 图表元素离散程度
# 方便在数值变更的时候调整图表分布
distance=50 # 用二阶列表保存现金流量的值
A = [[ -600,    0,    0,    0,    0,    0,    0 ] ,[    0,  350,  350,  450,  450,  450,  450 ],[    0, -200, -200, -250, -250, -250, -250 ] ]' 根据列表绘制资金流量图 '
# 区分正负值
# 是为了让负值的标签位置偏下不影响观感
for j in range(0,len(A)):for i in range(0,len(A[j])):if A[j][i] > 0:plt.arrow(i, 0, 0, A[j][i]-distance, fc=arrow_color, ec=arrow_color, shape="full", head_width=0.1, head_length=distance, overhang=0.5)plt.text(i+len(A)*0.01, A[j][i]+distance, str(round(A[j][i],2)))elif A[j][i] < 0:plt.arrow(i, 0, 0, A[j][i]-distance, fc=arrow_color, ec=arrow_color, shape="full", head_width=0.1, head_length=distance, overhang=0.5)plt.text(i+len(A)*0.01, A[j][i]-distance, str(round(A[j][i],2)))' 设置图表中各个元素的特征 '
# 下面这些其实没啥,主要都是美化图表ax = plt.gca()# 设置四个坐标轴不可见
ax.spines['top'].set_visible(False) # 设置坐标轴,下同
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)# 把 X 轴及其数据标签挪到图表当中
ax.spines['bottom'].set_position(('data',0))
plt.setp( ax.xaxis.get_majorticklabels(), ha="left" ) # right 表示 X 坐标数据标签向右对齐
plt.arrow(-0.1, 0, len(A[0])+1.2, 0, fc=axis_color, ec=axis_color, shape="full", head_width=distance*0.5, head_length=0.3, overhang=0.5)# 隐藏 y 坐标
plt.yticks([])# 设置 X 轴的刻度为1
x_major_locator=plt.MultipleLocator(1)      # 把x轴的刻度间隔设置为1,并存在变量里
ax.xaxis.set_major_locator(x_major_locator) # 把x轴的主刻度设置为1的倍数# 设置图表 X Y 范围,防止绘图区太大或太小
plt.xlim(-0.1, len(A[0])+1.4)
plt.ylim(-15*distance,15*distance)' 调整中文显示 '
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号' 绘图 '
plt.show()

绘制效果:

2. 绘制等额、等差、等比序列现金流量图

对于等额、等差、等比序列现金流量图的绘制,可以使用类似下面的循环,可以用循环生成等比序列,并添加到列表 A 的第一行,同时绘制一条等比曲线。



A[0].append(-30)'生成等比序列'
for i in range(0,7):A[0].append(10*(1.2)**i)# 画出等比曲线
x = np.arange(1,8)
y = 10*(1.2**(x-1))
plt.plot(x,y, c='g', ls='--') 

绘制效果:

3. 结合各种绘图方法绘制更加复杂的现金流量图

设计更加复杂的矩阵:



# 用二阶列表保存现金流量的值
A = [[       0,  80000,   80000,       0 ] ,[ -100000, -30000,  -30000,       0 ] ,[       0,      0,   30000,       0 ] ,[       0,      0, -300000,  -50000 ] ,[       0,      0,       0,  150000 ] ,[       0,      0,       0,  240000 ]

设置 arrow_color 为列表,并将遍历矩阵的部分改为 arrow_color[j] 可以为矩阵的每一行设置不同的颜色。



" 颜色设置 "
arrow_color = ['green','green','green','red','red','red']
axis_color  = 'black'
title_color = 'black'


for j in range(0,len(A)):for i in range(0,len(A[j])):if A[j][i] > 0:plt.arrow(i, 0, 0, A[j][i]-distance, fc=arrow_color[j], ec=arrow_color[j], shape="full", head_width=0.1, head_length=distance, overhang=0.5)plt.text(i+len(A)*0.01, A[j][i]+distance, str(round(A[j][i],2)))elif A[j][i] < 0:plt.arrow(i, 0, 0, A[j][i]+distance, fc=arrow_color[j], ec=arrow_color[j], shape="full", head_width=0.1, head_length=distance, overhang=0.5)plt.text(i+len(A)*0.01, A[j][i]-distance, str(round(A[j][i],2)))

添加标签,标注资金的利率和图例。


                        
# 添加一些标签
plt.text(0, 250000, r'利率 $i_{c} = 10 %$')'添加图例'
line1, = plt.plot(1,1, 'g', label='旧设备现金流')
line2, = plt.plot(2,2, 'r', label='新设备现金流')
plt.legend(handles=[line1, line2], loc='lower right')

绘图效果:

完整代码:



"""    绘制资金流量图    """" 颜色设置 "
arrow_color = ['green','green','green','red','red','red']
axis_color  = 'black'
title_color = 'black'' 导入相应的库 '
import matplotlib.pyplot as plt
import numpy as np' 设置绘图标题 '
plt.title("方案三:2年后更新设备的现金流量图", c=title_color)
plt.ylabel("资金(元)")' 设置初始变量值 '
# 图表元素离散程度
# 方便在数值变更的时候调整图表分布
distance=20000# 用二阶列表保存现金流量的值
A = [[       0,  80000,   80000,       0 ] ,[ -100000, -30000,  -30000,       0 ] ,[       0,      0,   30000,       0 ] ,[       0,      0, -300000,  -50000 ] ,[       0,      0,       0,  150000 ] ,[       0,      0,       0,  240000 ]]' 根据列表绘制资金流量图 '
# 区分正负值
# 是为了让负值的标签位置偏下不影响观感
for j in range(0,len(A)):for i in range(0,len(A[j])):if A[j][i] > 0:plt.arrow(i, 0, 0, A[j][i]-distance, fc=arrow_color[j], ec=arrow_color[j], shape="full", head_width=0.1, head_length=distance, overhang=0.5)plt.text(i+len(A)*0.01, A[j][i]+distance, str(round(A[j][i],2)))elif A[j][i] < 0:plt.arrow(i, 0, 0, A[j][i]+distance, fc=arrow_color[j], ec=arrow_color[j], shape="full", head_width=0.1, head_length=distance, overhang=0.5)plt.text(i+len(A)*0.01, A[j][i]-distance, str(round(A[j][i],2)))# 添加一些标签
plt.text(0, 250000, r'利率 $i_{c} = 10 %$')' 设置图表中各个元素的特征 '
# 下面这些其实没啥,主要都是美化图表ax = plt.gca()# 设置四个坐标轴不可见
ax.spines['top'].set_visible(False) # 设置坐标轴,下同
ax.spines['right'].set_visible(False)
ax.spines['left'].set_visible(False)
ax.spines['bottom'].set_visible(False)# 把 X 轴及其数据标签挪到图表当中
ax.spines['bottom'].set_position(('data',0))
plt.setp( ax.xaxis.get_majorticklabels(), ha="left" ) # right 表示 X 坐标数据标签向右对齐
for tick in ax.xaxis.get_major_ticks(): tick.label1.set_fontsize(12)
plt.arrow(-0.1, 0, len(A[0])+1.2, 0, fc=axis_color, ec=axis_color, shape="full", head_width=distance*0.5, head_length=0.3, overhang=0.5)# 隐藏 y 坐标
plt.yticks([])# 设置 X 轴的刻度为1
x_major_locator=plt.MultipleLocator(1)      # 把x轴的刻度间隔设置为1,并存在变量里
ax.xaxis.set_major_locator(x_major_locator) # 把x轴的主刻度设置为1的倍数# 设置图表 X Y 范围,防止绘图区太大或太小
plt.xlim(-0.1, len(A[0])+1.4)
plt.ylim(-15*distance,15*distance)'添加图例'
line1, = plt.plot(1,1, 'g', label='旧设备现金流')
line2, = plt.plot(2,2, 'r', label='新设备现金流')
plt.legend(handles=[line1, line2], loc='lower right')' 调整中文显示 '
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号' 绘图 '
plt.show()

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

如果您还需要从 CSV 读取数据、绘制更加复杂的现金流量图,同时处理多个现金流之间的关系以及税率、利率,请参考:

用 Python 绘制现金流量图 2 :进阶技巧

这篇关于用 Python 绘制现金流量图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/213077

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

【WebGPU Unleashed】1.1 绘制三角形

一部2024新的WebGPU教程,作者Shi Yan。内容很好,翻译过来与大家共享,内容上会有改动,加上自己的理解。更多精彩内容尽在 dt.sim3d.cn ,关注公众号【sky的数孪技术】,技术交流、源码下载请添加微信号:digital_twin123 在 3D 渲染领域,三角形是最基本的绘制元素。在这里,我们将学习如何绘制单个三角形。接下来我们将制作一个简单的着色器来定义三角形内的像素

nudepy,一个有趣的 Python 库!

更多资料获取 📚 个人网站:ipengtao.com 大家好,今天为大家分享一个有趣的 Python 库 - nudepy。 Github地址:https://github.com/hhatto/nude.py 在图像处理和计算机视觉应用中,检测图像中的不适当内容(例如裸露图像)是一个重要的任务。nudepy 是一个基于 Python 的库,专门用于检测图像中的不适当内容。该

Flutter 进阶:绘制加载动画

绘制加载动画:由小圆组成的大圆 1. 定义 LoadingScreen 类2. 实现 _LoadingScreenState 类3. 定义 LoadingPainter 类4. 总结 实现加载动画 我们需要定义两个类:LoadingScreen 和 LoadingPainter。LoadingScreen 负责控制动画的状态,而 LoadingPainter 则负责绘制动画。

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

HTML提交表单给python

python 代码 from flask import Flask, request, render_template, redirect, url_forapp = Flask(__name__)@app.route('/')def form():# 渲染表单页面return render_template('./index.html')@app.route('/submit_form',

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87