KnowledgePicker.WordCloud
是一个现代(.NET Standard 2.0)且快速的库,用于排列和绘制文字云(又名标签云或 wordle)。它使用四叉树来实现超快的性能。它由 KnowledgePicker 团队维护。
安装 NuGet 包KnowledgePicker.WordCloud
。
注意目前只有一种基于 SkiaSharp 的绘图引擎。在某些平台上,需要安装额外的依赖项才能使 SkiaSharp 正常工作。例如,在 Linux 上,添加 SkiaSharp.NativeAssets.Linux;对于 Blazor WebAssembly,添加 SkiaSharp.Views.Blazor。
获取WordCloudEntry
的集合。例如,假设我们有词频词典:
var rates = new Dictionary<string, int>();// ...以某种方式收集词频...IEnumerable<WordCloudEntry> wordEntries = rates.Select(p => new WordCloudEntry(p.Key, p.Value)) ;
创建世界云配置:
var wordCloud = new WordCloudInput(wordEntries){宽度 = 1024,高度 = 256,MinFontSize = 8,MaxFontSize = 32};
我们需要创建绘图引擎、字体大小调整器和布局。目前,我们使用 SkiaSharp 进行快速跨平台字体测量(和绘图)。我们还只支持对数字体大小和螺旋布局。所有这些都是以通用方式实现的,并且可以轻松扩展(欢迎贡献)。
var sizer = new LogSizer(wordCloud);使用 var engine = new SkGraphicEngine(sizer, wordCloud);var layout = new SpiralLayout(wordCloud);var colorizer = new RandomColorizer(); // 可选var wcg = new WordCloudGenerator<SKBitmap>(wordCloud, 引擎, 布局, 着色器);
您还可以使用SpecificColorizer
用所选颜色为特定单词着色:
var colorizer = new SpecificColorizer(new Dictionary<string, Color>{["KnowledgePicker"] = Color.FromArgb(0x0f3057),["WordCloud"] = Color.FromArgb(0xe25a5a)},fallback: new RandomColorizer()); // 后备参数是可选的
您还可以选择将字体传递到图形引擎中:
var typeface = SKTypeface.FromFamilyName("DejaVu Serif", SKFontStyle.Normal);使用 var engine = new SkGraphicEngine(sizer, wordCloud, typeface);
现在我们可以整理主题云了:
IEnumerable<(LayoutItem Item, double FontSize)> items = wcg.Arrange();
例如,如果我们处于 ASP.NET Core 应用程序的 Razor 视图中,我们可以从items
生成 SVG:
<svg viewBox="0,0,@wordCloud.Width,@wordCloud.Height">@foreach(var(item, fontSize) in items){const string format = "0.##"; // 最多使用 2 位小数。 var x = (item.Location.X - item.Measured.Left).ToString(format);var y = (item.Location.Y - item.Measured.Top).ToString(format);var fs = fontSize.ToString (格式);var color = wcg.GetColorHexString(item); <text transform="translate(@x, @y)" font-size="@fs" fill="@color">@item.Entry.Word</text>}</svg>
或者,我们可以绘制主题云(另请参见示例WordFrequencies.ConsoleApp
):
using var Final = new SKBitmap(wordCloud.Width, wordCloud.Height);using var canvas = new SKCanvas(final);// 在白色背景上绘制.canvas.Clear(SKColors.White);using var bitmap = wcg.Draw( );canvas.DrawBitmap(bitmap, 0, 0);// 保存为 PNG。using var data = Final.Encode(SKEncodedImageFormat.Png, 100);使用var writer = File.Create("output.png");data.SaveTo(writer);
世界云算法最初是从SourceCodeCloud移植的。它使用四叉树,因此它应该相当快。它的灵感来自 Wordle(曾经在现已不复存在的网站 wordle.net 上使用的著名算法)的实现。
简单的控制台应用程序是WordFrequencies.ConsoleApp
,它为标准输入上给出的单词绘制词云 PNG。
KnowledgePicker 也在生产中使用该库。他们用它来绘制用户个人资料的主题云。
如上所述,现在仅实现了部分功能,但欢迎所有贡献。请随意提出问题并提出请求。
目前仅在 Linux 上支持测试,因为它们是快照测试(生成词云图像并将其与快照逐字节进行比较),并且需要做更多的工作来确保这是跨平台的(例如,使用完全相同的字体)。在 Windows 上,测试可以在 WSL 中运行(Visual Studio 直接支持)。测试也会在 GitHub Actions 中自动运行。
推送标签后,会触发 GitHub 工作流release.yml
从而构建并发布 NuGet 包。