我有一个数据帧,看起来是这样的:

    components       non_breaking_count breaking_count
0   paths-modified              22956   8640
1   endpoints-modified          22155   8149
2   endpoints-added              8109   5354
3   paths-added                  7375   4787
4   info-version                 5680   857
5   components-schemas-added     2555   1597
6   info-description             1940   762
7   tags-added                   1031   564
8   info-title                   859    551
9   servers-added                711    332
10  info-termsOfService          701    161
11  servers-deleted              609    262
12  components-schemas-deleted   588    938
13  components-securitySchemes   301    112
14  tags-modified                297    128
15  components-securitySchemes  229     171
16  components-parameters-added 209     239
17  tags-deleted                199     541
18  components-responses-added  183     164
19  info-contact-name           153     96
20  security-added              140     121
21  info-contact-email          132     110
22  servers-modified            120     32
23  info-license-name           115     46
24  info-license-url            105     36
25  paths-deleted                97     4979
26  info-contact-url             93     51
27  components-securitySchemes-deleted  87  71
28  endpoints-deleted            84     5612

我一直在寻找一种很好的方法来可视化这一点,包括它们的计数和注释(对于所有组件列).我正在寻找的是一个图表打破和另一个不打破.

我脑海中有一个条形图,其中breakingnon breaking有两个条形图,但是要适应28个值有点困难,所以我不得不放弃这个选项.我也try 了echarts的夜莺图,但不知何故比例不匹配.另一种方法是treemap,但这和pie chart是我希望避免的.

有没有人有任何建议,我可以使用哪种类型的图表来有效地可视化这些数据.

推荐答案

我认为这里有几个挑战:

  • 品类数量
  • 极值差分

条形图(水平或极轴)很好地处理了许多类别,但处理极值差异并不总是那么容易.此外,在条形图中使用对数轴可以提供有用的可视化效果.原木轴线的一个不利之处是,它可能没有被一些观众完全理解.

也就是说,我更喜欢在这种情况下使用Bubble Chart,这样我就可以使用标记大小到help illustrate the value's magnitude.Alog axis可以进一步增加清晰度.

为方便起见,我将数据放在文本文件中,并通过Pandas 导入:

import pandas as pd
df = pd.read_csv("visualization-of-descending-count.txt", delim_whitespace=True)

虽然请求指定了两个独立的曲线图,但散点可以同时包含两组数据和我所使用的内容.进一步的条件可以给出如何规模的浮标大小…zoom 到两个组的最大值或每个组的最大值(请参见示例中的注释).

import plotly.graph_objects as go
max_value = df[['breaking_count', 'non_breaking_count']].max().max()

fig = go.Figure()
fig.add_trace(go.Scatter(name="Non-Breaking",
    x=df.non_breaking_count,
    y=df.components, 
    mode='markers', 
    marker=dict(
        size=df.non_breaking_count,
        sizemode='area',
        # unified scale between two groups using max_value
        sizeref=2.*max_value/(40.**2),
        # unique scale for each group
#         sizeref=2.*max(df.non_breaking_count)/(40.**2),
        sizemin=3)))

fig.add_trace(go.Scatter(name="Breaking",
    x=df.breaking_count,
    y=df.components, 
    mode='markers', 
    marker=dict(
        size=df.breaking_count,
        sizemode='area',
         # unified scale between two groups using max_value
        sizeref=2.*max_value/(40.**2),
        # unique scale for each group
#         sizeref=2.*max(df.breaking_count)/(40.**2),
        sizemin=3)))

fig.update_layout(height=1000, width=1000,)
fig.show()

base

切换到对数轴:

fig.update_layout(xaxis=dict(type='log'))
fig.show()

with log axis

附注:components-securitySchemes有两个条目.

Python相关问答推荐

如何防止Plotly在输出到PDF时减少行中的点数?

Polars:使用列值引用when / then表达中的其他列

添加包含中具有任何值的其他列的计数的列

使用scipy. optimate.least_squares()用可变数量的参数匹配两条曲线

ModuleNotFound错误:没有名为Crypto Windows 11、Python 3.11.6的模块

处理带有间隙(空)的duckDB上的重复副本并有效填充它们

为什么sys.exit()不能与subproccess.run()或subprocess.call()一起使用

如何从.cgi网站刮一张表到rame?

"使用odbc_connect(raw)连接字符串登录失败;可用于pyodbc"

我想一列Panadas的Rashrame,这是一个URL,我保存为CSV,可以直接点击

Odoo 16使用NTFS使字段只读

Polars将相同的自定义函数应用于组中的多个列,

从列表中获取n个元素,其中list [i][0]== value''

(Python/Pandas)基于列中非缺失值的子集DataFrame

ruamel.yaml dump:如何阻止map标量值被移动到一个新的缩进行?

Cython无法识别Numpy类型

在Google Drive中获取特定文件夹内的FolderID和文件夹名称

Pandas在rame中在组内洗牌行,保持相对组的顺序不变,

多个矩阵的张量积

用来自另一个数据框的列特定标量划分Polars数据框中的每一列,