373 lines
15 KiB
Python
373 lines
15 KiB
Python
#!/usr/bin/env python3
|
||
# -*- coding: utf-8 -*-
|
||
"""
|
||
融资计划书图表生成工具
|
||
Generate charts and diagrams for financing plan
|
||
"""
|
||
|
||
import matplotlib.pyplot as plt
|
||
import matplotlib.patches as patches
|
||
import numpy as np
|
||
import pandas as pd
|
||
from matplotlib.font_manager import FontProperties
|
||
import seaborn as sns
|
||
from datetime import datetime
|
||
import os
|
||
|
||
# 设置中文字体
|
||
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei', 'SimHei', 'DejaVu Sans']
|
||
plt.rcParams['axes.unicode_minus'] = False
|
||
|
||
class FinancingChartGenerator:
|
||
"""融资计划书图表生成器"""
|
||
|
||
def __init__(self, output_dir='charts'):
|
||
self.output_dir = output_dir
|
||
if not os.path.exists(output_dir):
|
||
os.makedirs(output_dir)
|
||
|
||
# 设置颜色主题
|
||
self.colors = {
|
||
'primary': '#1F497D',
|
||
'secondary': '#365F91',
|
||
'accent': '#4F81BD',
|
||
'success': '#70AD47',
|
||
'warning': '#FFC000',
|
||
'danger': '#C5504B',
|
||
'light': '#F2F2F2',
|
||
'dark': '#404040'
|
||
}
|
||
|
||
def generate_market_size_chart(self):
|
||
"""生成市场规模图表"""
|
||
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
|
||
|
||
# 市场规模数据
|
||
markets = ['智能穿戴设备', '健康管理服务', '目标细分市场']
|
||
sizes = [400, 10000, 500]
|
||
colors = [self.colors['primary'], self.colors['secondary'], self.colors['accent']]
|
||
|
||
# 柱状图
|
||
bars = ax1.bar(markets, sizes, color=colors, alpha=0.8)
|
||
ax1.set_title('2025年市场规模预测(亿元)', fontsize=14, fontweight='bold')
|
||
ax1.set_ylabel('市场规模(亿元)')
|
||
|
||
# 添加数值标签
|
||
for bar, size in zip(bars, sizes):
|
||
height = bar.get_height()
|
||
ax1.text(bar.get_x() + bar.get_width()/2., height + 50,
|
||
f'{size}亿', ha='center', va='bottom', fontweight='bold')
|
||
|
||
# 饼图 - 目标用户分布
|
||
user_segments = ['在校学生', '老年人群', '其他健康群体']
|
||
user_counts = [2.9, 2.64, 1.0]
|
||
|
||
ax2.pie(user_counts, labels=user_segments, autopct='%1.1f亿',
|
||
colors=[colors[1] for colors in [self.colors['primary'], self.colors['secondary'], self.colors['accent']]],
|
||
startangle=90)
|
||
ax2.set_title('目标用户群体分布', fontsize=14, fontweight='bold')
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(f'{self.output_dir}/market_analysis.png', dpi=300, bbox_inches='tight')
|
||
plt.close()
|
||
|
||
def generate_financial_projection(self):
|
||
"""生成财务预测图表"""
|
||
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(16, 12))
|
||
|
||
# 收入预测
|
||
years = ['2025年', '2026年', '2027年']
|
||
revenues = [2000, 8000, 30000]
|
||
|
||
ax1.plot(years, revenues, marker='o', linewidth=3, markersize=8,
|
||
color=self.colors['primary'])
|
||
ax1.fill_between(years, revenues, alpha=0.3, color=self.colors['primary'])
|
||
ax1.set_title('收入预测(万元)', fontsize=14, fontweight='bold')
|
||
ax1.set_ylabel('收入(万元)')
|
||
ax1.grid(True, alpha=0.3)
|
||
|
||
# 添加数值标签
|
||
for i, (year, revenue) in enumerate(zip(years, revenues)):
|
||
ax1.text(i, revenue + 1000, f'{revenue}万', ha='center', va='bottom', fontweight='bold')
|
||
|
||
# 收入结构 - 2027年预测
|
||
revenue_types = ['硬件销售', '平台服务', '数据服务', '数字资产']
|
||
revenue_values = [12000, 10000, 5000, 3000]
|
||
|
||
wedges, texts, autotexts = ax2.pie(revenue_values, labels=revenue_types, autopct='%1.1f%%',
|
||
colors=[self.colors['primary'], self.colors['secondary'],
|
||
self.colors['accent'], self.colors['success']])
|
||
ax2.set_title('2027年收入结构预测', fontsize=14, fontweight='bold')
|
||
|
||
# 成本结构分析
|
||
cost_types = ['硬件采购\n40%', '销售费用\n15%', '运营服务\n20%', '其他成本\n25%']
|
||
cost_percentages = [40, 15, 20, 25]
|
||
|
||
bars = ax3.barh(cost_types, cost_percentages,
|
||
color=[self.colors['danger'], self.colors['warning'],
|
||
self.colors['accent'], self.colors['dark']])
|
||
ax3.set_title('成本结构分析', fontsize=14, fontweight='bold')
|
||
ax3.set_xlabel('占收入比例(%)')
|
||
|
||
# 盈利能力分析
|
||
years_profit = ['2025年', '2026年', '2027年']
|
||
gross_margin = [60, 60, 60]
|
||
net_margin = [15, 25, 30]
|
||
|
||
x = np.arange(len(years_profit))
|
||
width = 0.35
|
||
|
||
ax4.bar(x - width/2, gross_margin, width, label='毛利率', color=self.colors['success'])
|
||
ax4.bar(x + width/2, net_margin, width, label='净利率', color=self.colors['primary'])
|
||
|
||
ax4.set_title('盈利能力分析', fontsize=14, fontweight='bold')
|
||
ax4.set_ylabel('利润率(%)')
|
||
ax4.set_xticks(x)
|
||
ax4.set_xticklabels(years_profit)
|
||
ax4.legend()
|
||
ax4.grid(True, alpha=0.3)
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(f'{self.output_dir}/financial_projection.png', dpi=300, bbox_inches='tight')
|
||
plt.close()
|
||
|
||
def generate_business_model_flow(self):
|
||
"""生成商业模式流程图"""
|
||
fig, ax = plt.subplots(figsize=(14, 10))
|
||
|
||
# 定义流程节点
|
||
nodes = [
|
||
{'name': '数据采集层', 'pos': (2, 8), 'color': self.colors['primary']},
|
||
{'name': '数据传输层', 'pos': (4, 8), 'color': self.colors['secondary']},
|
||
{'name': '数据处理层', 'pos': (6, 8), 'color': self.colors['accent']},
|
||
{'name': '数据存储层', 'pos': (8, 8), 'color': self.colors['success']},
|
||
{'name': '数据分析层', 'pos': (10, 8), 'color': self.colors['warning']},
|
||
{'name': '价值输出层', 'pos': (10, 6), 'color': self.colors['danger']},
|
||
{'name': '资产确权层', 'pos': (8, 4), 'color': self.colors['primary']},
|
||
{'name': '价值变现层', 'pos': (4, 4), 'color': self.colors['secondary']},
|
||
]
|
||
|
||
# 绘制节点
|
||
for node in nodes:
|
||
circle = patches.Circle(node['pos'], 0.8, facecolor=node['color'],
|
||
edgecolor='white', linewidth=2, alpha=0.8)
|
||
ax.add_patch(circle)
|
||
ax.text(node['pos'][0], node['pos'][1], node['name'],
|
||
ha='center', va='center', fontsize=10, fontweight='bold', color='white')
|
||
|
||
# 绘制连接线
|
||
connections = [
|
||
((2, 8), (4, 8)), ((4, 8), (6, 8)), ((6, 8), (8, 8)),
|
||
((8, 8), (10, 8)), ((10, 8), (10, 6)), ((10, 6), (8, 4)),
|
||
((8, 4), (4, 4)), ((4, 4), (2, 8))
|
||
]
|
||
|
||
for start, end in connections:
|
||
ax.annotate('', xy=end, xytext=start,
|
||
arrowprops=dict(arrowstyle='->', lw=2, color=self.colors['dark']))
|
||
|
||
# 添加硬件设备
|
||
hardware = [
|
||
{'name': '智能手环', 'pos': (1, 6)},
|
||
{'name': '基站设备', 'pos': (2, 6)},
|
||
{'name': '摄像设备', 'pos': (3, 6)}
|
||
]
|
||
|
||
for hw in hardware:
|
||
rect = patches.Rectangle((hw['pos'][0]-0.4, hw['pos'][1]-0.3), 0.8, 0.6,
|
||
facecolor=self.colors['light'], edgecolor=self.colors['dark'])
|
||
ax.add_patch(rect)
|
||
ax.text(hw['pos'][0], hw['pos'][1], hw['name'],
|
||
ha='center', va='center', fontsize=8)
|
||
|
||
ax.set_xlim(0, 12)
|
||
ax.set_ylim(2, 10)
|
||
ax.set_aspect('equal')
|
||
ax.axis('off')
|
||
ax.set_title('全生命周期AI监测商业模式闭环', fontsize=16, fontweight='bold', pad=20)
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(f'{self.output_dir}/business_model_flow.png', dpi=300, bbox_inches='tight')
|
||
plt.close()
|
||
|
||
def generate_competition_matrix(self):
|
||
"""生成竞争力矩阵图"""
|
||
fig, ax = plt.subplots(figsize=(12, 8))
|
||
|
||
# 竞争维度数据
|
||
dimensions = ['技术创新', '商业模式', '成本优势', '客户粘性']
|
||
competitive_advantage = [5, 5, 5, 4]
|
||
technical_barrier = [5, 4, 3, 4]
|
||
market_impact = [5, 5, 4, 5]
|
||
|
||
x = np.arange(len(dimensions))
|
||
width = 0.25
|
||
|
||
bars1 = ax.bar(x - width, competitive_advantage, width, label='竞争优势',
|
||
color=self.colors['primary'], alpha=0.8)
|
||
bars2 = ax.bar(x, technical_barrier, width, label='技术壁垒',
|
||
color=self.colors['secondary'], alpha=0.8)
|
||
bars3 = ax.bar(x + width, market_impact, width, label='市场影响',
|
||
color=self.colors['accent'], alpha=0.8)
|
||
|
||
ax.set_title('核心竞争力矩阵分析', fontsize=16, fontweight='bold')
|
||
ax.set_ylabel('评分(1-5分)')
|
||
ax.set_xticks(x)
|
||
ax.set_xticklabels(dimensions)
|
||
ax.legend()
|
||
ax.grid(True, alpha=0.3)
|
||
ax.set_ylim(0, 6)
|
||
|
||
# 添加数值标签
|
||
for bars in [bars1, bars2, bars3]:
|
||
for bar in bars:
|
||
height = bar.get_height()
|
||
ax.text(bar.get_x() + bar.get_width()/2., height + 0.1,
|
||
f'{height}', ha='center', va='bottom', fontweight='bold')
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(f'{self.output_dir}/competition_matrix.png', dpi=300, bbox_inches='tight')
|
||
plt.close()
|
||
|
||
def generate_data_value_chain(self):
|
||
"""生成数据价值递增模型"""
|
||
fig, ax = plt.subplots(figsize=(14, 6))
|
||
|
||
stages = ['原始数据', '清洗数据', '分析数据', '洞察数据', '资产数据']
|
||
values = [1, 2, 5, 10, 50]
|
||
|
||
# 创建阶梯式增长图
|
||
x_pos = np.arange(len(stages))
|
||
bars = ax.bar(x_pos, values, color=[self.colors['primary'], self.colors['secondary'],
|
||
self.colors['accent'], self.colors['success'],
|
||
self.colors['warning']], alpha=0.8)
|
||
|
||
# 添加连接线
|
||
for i in range(len(stages)-1):
|
||
ax.annotate('', xy=(x_pos[i+1], values[i+1]), xytext=(x_pos[i], values[i]),
|
||
arrowprops=dict(arrowstyle='->', lw=2, color=self.colors['dark']))
|
||
|
||
ax.set_title('数据价值递增模型', fontsize=16, fontweight='bold')
|
||
ax.set_ylabel('价值倍数')
|
||
ax.set_xticks(x_pos)
|
||
ax.set_xticklabels(stages)
|
||
ax.grid(True, alpha=0.3)
|
||
|
||
# 添加数值标签
|
||
for bar, value in zip(bars, values):
|
||
height = bar.get_height()
|
||
ax.text(bar.get_x() + bar.get_width()/2., height + 1,
|
||
f'{value}倍', ha='center', va='bottom', fontweight='bold', fontsize=12)
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(f'{self.output_dir}/data_value_chain.png', dpi=300, bbox_inches='tight')
|
||
plt.close()
|
||
|
||
def generate_investment_return_chart(self):
|
||
"""生成投资回报分析图"""
|
||
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(2, 2, figsize=(16, 12))
|
||
|
||
# 三阶段融资规模
|
||
stages = ['第一阶段\n2025年', '第二阶段\n2026年', '第三阶段\n2027年']
|
||
funding_amounts = [1000, 6000, 30000]
|
||
|
||
bars = ax1.bar(stages, funding_amounts,
|
||
color=[self.colors['primary'], self.colors['secondary'], self.colors['accent']])
|
||
ax1.set_title('三阶段融资计划(万元)', fontsize=14, fontweight='bold')
|
||
ax1.set_ylabel('融资金额(万元)')
|
||
|
||
for bar, amount in zip(bars, funding_amounts):
|
||
height = bar.get_height()
|
||
ax1.text(bar.get_x() + bar.get_width()/2., height + 500,
|
||
f'{amount}万', ha='center', va='bottom', fontweight='bold')
|
||
|
||
# 投资回报倍数
|
||
investment_stages = ['第一阶段', '第二阶段', '整体投资']
|
||
return_multiples = [1.8, 4, 20]
|
||
|
||
ax2.bar(investment_stages, return_multiples,
|
||
color=[self.colors['success'], self.colors['warning'], self.colors['danger']])
|
||
ax2.set_title('预期投资回报倍数', fontsize=14, fontweight='bold')
|
||
ax2.set_ylabel('回报倍数')
|
||
|
||
# 公司估值增长
|
||
years = [2025, 2026, 2027, 2028, 2030]
|
||
valuations = [0.5, 2, 15, 30, 50]
|
||
|
||
ax3.plot(years, valuations, marker='o', linewidth=3, markersize=8,
|
||
color=self.colors['primary'])
|
||
ax3.fill_between(years, valuations, alpha=0.3, color=self.colors['primary'])
|
||
ax3.set_title('公司估值预测(亿元)', fontsize=14, fontweight='bold')
|
||
ax3.set_ylabel('估值(亿元)')
|
||
ax3.grid(True, alpha=0.3)
|
||
|
||
# 股权结构变化
|
||
stages_equity = ['初始', '第一轮后', '第二轮后', '上市后']
|
||
original_equity = [100, 80, 60, 45]
|
||
investor_equity = [0, 20, 40, 55]
|
||
|
||
width = 0.6
|
||
ax4.bar(stages_equity, original_equity, width, label='原股东',
|
||
color=self.colors['primary'])
|
||
ax4.bar(stages_equity, investor_equity, width, bottom=original_equity,
|
||
label='投资者', color=self.colors['secondary'])
|
||
|
||
ax4.set_title('股权结构变化', fontsize=14, fontweight='bold')
|
||
ax4.set_ylabel('股权比例(%)')
|
||
ax4.legend()
|
||
|
||
plt.tight_layout()
|
||
plt.savefig(f'{self.output_dir}/investment_return.png', dpi=300, bbox_inches='tight')
|
||
plt.close()
|
||
|
||
def generate_all_charts(self):
|
||
"""生成所有图表"""
|
||
print("正在生成融资计划书图表...")
|
||
|
||
try:
|
||
print("1. 生成市场分析图表...")
|
||
self.generate_market_size_chart()
|
||
|
||
print("2. 生成财务预测图表...")
|
||
self.generate_financial_projection()
|
||
|
||
print("3. 生成商业模式流程图...")
|
||
self.generate_business_model_flow()
|
||
|
||
print("4. 生成竞争力矩阵图...")
|
||
self.generate_competition_matrix()
|
||
|
||
print("5. 生成数据价值链图...")
|
||
self.generate_data_value_chain()
|
||
|
||
print("6. 生成投资回报分析图...")
|
||
self.generate_investment_return_chart()
|
||
|
||
print(f"\n✅ 所有图表已生成完成!")
|
||
print(f"📁 图表保存位置: {self.output_dir}/")
|
||
print("📄 生成的图表文件:")
|
||
chart_files = [
|
||
"market_analysis.png - 市场分析图表",
|
||
"financial_projection.png - 财务预测图表",
|
||
"business_model_flow.png - 商业模式流程图",
|
||
"competition_matrix.png - 竞争力矩阵图",
|
||
"data_value_chain.png - 数据价值链图",
|
||
"investment_return.png - 投资回报分析图"
|
||
]
|
||
for file in chart_files:
|
||
print(f" 📊 {file}")
|
||
|
||
except Exception as e:
|
||
print(f"❌ 图表生成失败: {e}")
|
||
return False
|
||
|
||
return True
|
||
|
||
def main():
|
||
"""主函数"""
|
||
generator = FinancingChartGenerator()
|
||
generator.generate_all_charts()
|
||
|
||
if __name__ == '__main__':
|
||
main()
|