您可以将此问题视为Graph并绘制它的图表WeightedAdjacencyMatrix。我正在使用Wolfram 语言,但相同的步骤适用于您选择的语言。
我将从最近对十大流行 DBMS的调查中创建一些示例数据。
dbs = {{"Oracle", 1271}, {"MySQL", 1228}, {"Microsoft SQL Server", 991},
{"PostgreSQL", 569}, {"MongoDB", 488}, {"IBM Db2", 167},
{"Redis", 165}, {"Elasticsearch", 155}, {"SQLite", 131},
{"Microsoft Access", 115}};
wd = WeightedData[Sequence @@ Transpose[dbs]];
BarChart[
wd["Weights"]
, ChartLabels -> {None, wd["InputData"]}
, BarOrigin -> Left
, PlotTheme -> "Detailed"
]

EmpiricalDistribution然后使用调查的内部生成 200 对从到移动WeightedData。
SeedRandom[123];
moves = RandomChoice[wd, {200, 2}];
收集Counts对。
counts = Counts[moves];
Short@counts
<|{MySQL,SQLite}->2,{Elasticsearch,SQLite}->1,<<52>>,{Microsoft SQL Server,Redis}->1,{IBM Db2,MongoDB}->1|>
为 DBMS 名称创建索引。
With[{n = wd["InputData"]}
, vertex = Thread[n -> Range@Length@n]
];
Short@vertex
{Oracle->1,MySQL->2,Microsoft SQL Server->3,<<4>>,Elasticsearch->8,SQLite->9,Microsoft Access->10}
使用for 索引创建SparseArray邻接矩阵。countsvertex
adjMatrix = SparseArray[Normal@counts /. vertex, ConstantArray[Length@vertex, 2]];
adjMatrix // MatrixForm

MatrixPlot矩阵。
ticks = List @@@ Reverse[vertex, {2}];
MatrixPlot[
SparseArray[Normal@counts /. vertex]
, FrameTicks -> {
ticks
, MapAt[Rotate[#, π/2] &, ticks, {All, -1}]
}
, PlotLegends -> Automatic
, Mesh -> All
, MeshStyle -> LightGray
]

该图也可以counts用Thickness和Opacity的函数绘制EdgeWeight。
edgeStyle =
Thread[
(Rule @@@ Keys[counts] /. vertex ) ->
Apply[
Directive[Opacity@#, Thickness@#2] &
, Transpose[{
Rescale[#, MinMax@#, {.25, 1}]
, Rescale[#, MinMax@#, {.002, .005}]
} &@Values[counts]
]
, {1}
]
];
graph = Graph[
Rule @@@ Keys[counts] /. vertex
, VertexLabels -> Reverse[vertex, {2}]
, EdgeWeight -> Values[counts]
, EdgeStyle -> edgeStyle
, GraphLayout -> "CircularEmbedding"
]

希望这可以帮助。