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 Randomorizer(); // 後備參數是可選的
您也可以選擇將字體傳遞到圖形引擎:
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。 data .SaveTo(作者);
世界雲端演算法最初是從SourceCodeCloud移植的。它使用四叉樹,因此它應該相當快。它的靈感來自 Wordle(曾經在現已不復存在的網站 wordle.net 上使用的著名演算法)的實作。
簡單的控制台應用程式是WordFrequencies.ConsoleApp
,它為標準輸入上給出的單字繪製詞雲 PNG。
KnowledgePicker 也在生產中使用該庫。他們用它來繪製使用者個人資料的主題雲。
如上所述,現在僅實現了部分功能,但歡迎所有貢獻。請隨意提出問題並提出請求。
目前僅在Linux 上支援測試,因為它們是快照測試(生成詞雲圖像並將其與快照逐字節進行比較),並且需要做更多的工作來確保這是跨平台的(例如,使用完全相同的字體)。在 Windows 上,測試可以在 WSL 中執行(Visual Studio 直接支援)。測試也會在 GitHub Actions 中自動執行。
推送標籤後,會觸發 GitHub 工作流程release.yml
從而建置並發布 NuGet 套件。