N 个元素的数据可视化从 x 切换到 y

数据挖掘 可视化
2022-02-27 18:24:28

是否有针对此类数据的推荐可视化:

Company x switched from MySQL to Postgres
Company y switched from mongodb to tidb
Company z switched from mongodb to MySQL

我不关心可视化公司,唯一重要的是表示切换(即:从 MySQL 切换到 mongodb 的公司比从 Postgres 切换到 tidb 的公司更多)。

不确定我的问题是否足够清楚,这是我的第一个问题,如果我能改进它,请告诉我!

3个回答

您可以将此问题视为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
 ]

数学图形

该图也可以countsThicknessOpacity的函数绘制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"
  ]

数学图形

希望这可以帮助。

您可以使用热图,其行和列分别是软件来源和软件目的地,值是从一个切换到另一个的用户数量。

这可能看起来像这样:

在此处输入图像描述

向您的数据集添加一个新列。如果“MySQL 到 MongoDB”,则将该列的值设置为 0,如果“Postgres 到 tidb”,则将该列的值设置为 1。

然后根据新列创建条形图。并在传说中提到什么是0,什么是1。