You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过IronPython在C#项目中执行绘制树状图的Python方法?

如何将Python树状图绘制代码封装为方法并通过IronPython在C#项目中执行

问题背景

你已经有一段可以正常运行的Python代码用于绘制树状图:

import numpy as np
from scipy.cluster.hierarchy import linkage,dendrogram
import matplotlib.pyplot as plt
x = np.array([[2,3],[5,5],[4.3,6],[5.5,4.9],[4.4,5.8],[10,10],[40,40], [2.2,5]])
plt.scatter(x[:,0],x[:,1],s=30)
lin=linkage(x,"single")
den=dendrogram(lin,truncate_mode="none")
plt.show()

现在需要将这段代码封装为Python脚本中的方法,并通过IronPython在C#项目中调用执行。


解决方案步骤

1. 封装Python代码为可调用方法

首先把你的代码改写成一个可复用的方法,考虑到在C#环境中直接调用plt.show()可能会有UI交互问题,我们可以修改为将树状图保存为图片文件,或者提供参数控制显示/保存。以下是封装后的Python脚本(命名为dendrogram_plotter.py):

import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt

# 强制使用非交互式后端,避免C#环境中的UI异常
plt.switch_backend('Agg')

def generate_dendrogram(output_path=None, show_plot=False, input_data=None):
    # 支持传入外部数据,没有则使用默认示例数据
    x = input_data if input_data is not None else np.array([[2,3],[5,5],[4.3,6],[5.5,4.9],[4.4,5.8],[10,10],[40,40], [2.2,5]])
    
    plt.figure(figsize=(10, 6))
    plt.scatter(x[:,0], x[:,1], s=30)
    lin = linkage(x, "single")
    dendrogram(lin, truncate_mode="none")
    
    if output_path:
        plt.savefig(output_path, dpi=300, bbox_inches='tight')
    
    if show_plot:
        plt.switch_backend('TkAgg')  # 临时切换回交互式后端显示窗口
        plt.show()
    
    plt.close()  # 关闭绘图资源,避免内存泄漏

2. 配置C#项目引入IronPython

在你的C#项目中,通过NuGet安装以下包:

  • IronPython:核心IronPython运行时
  • IronPython.StdLib:IronPython标准库

另外,需要确保你的Python环境中已经安装了numpy、scipy和matplotlib,可以通过pip install numpy scipy matplotlib完成安装。

3. 在C#中调用IronPython执行方法

编写C#代码来加载Python脚本并调用封装好的方法。以下是示例代码:

using IronPython.Hosting;
using Microsoft.Scripting.Hosting;
using System;
using System.Collections.Generic;

namespace IronPythonDendrogramDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            // 创建IronPython运行时
            var engine = Python.CreateEngine();
            var scope = engine.CreateScope();

            // 添加Python库的搜索路径(替换为你的实际Python环境路径)
            var pythonLibPath = @"C:\Python39\Lib";
            var sitePackagesPath = @"C:\Python39\Lib\site-packages";
            var scriptPath = AppDomain.CurrentDomain.BaseDirectory;
            engine.SetSearchPaths(new[] { pythonLibPath, sitePackagesPath, scriptPath });

            try
            {
                // 加载Python脚本
                engine.ExecuteFile("dendrogram_plotter.py", scope);

                // 获取Python方法
                var generateMethod = scope.GetVariable<Func<string, bool, object, object>>("generate_dendrogram");

                // 示例1:使用默认数据,保存图片到指定路径
                generateMethod(@"C:\output\dendrogram_default.png", false, null);

                // 示例2:传入自定义数据(转换为IronPython可识别的列表格式)
                var customData = new List<List<double>>
                {
                    new List<double> {1,2},
                    new List<double> {3,4},
                    new List<double> {6,7}
                };
                generateMethod(@"C:\output\dendrogram_custom.png", false, customData);

                Console.WriteLine("树状图已成功生成并保存!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"执行出错:{ex.Message}\n{ex.StackTrace}");
            }
        }
    }
}

4. 关键注意事项

  • 后端设置:在Python脚本中默认使用Agg非交互式后端,避免在C#非交互式环境中出现Tkinter相关异常;如果需要显示窗口,再临时切换回TkAgg。
  • 库路径配置:必须确保IronPython能找到numpy、scipy和matplotlib的安装路径,否则会出现导入错误。
  • 资源释放:调用plt.close()释放绘图资源,防止内存泄漏。
  • 数据传递:C#向Python传递数据时,尽量使用IronPython兼容的类型(如List<List<double>>对应Python的二维列表),避免类型转换异常。

内容的提问来源于stack exchange,提问作者MahHassan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:10:09