Question: I have a dataframe that looks like this:  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  I have been looking for a good way to visualize this with their counts and annotation( for all the components column). What i am looking for is one graph for breaking and another for non breaking. I had a sliced bar chart in mind, with two bars for breaking and non breaking, however fitting in 28 values is a bit difficult, so I had to discard that option. I tried with nightingale chart in echarts as well, but the proportions are a mismatch somehow. Another way would be a treemap, but that and pie chart is something I wish to avoid. Does anyone have any suggestions on which type of graph I could use to effectively visualize this data.

Answer: I think there are several challenges here:  amount of categories extreme value difference  Bar plots (either horizontal or polar) handle numerous categories well but it's not always easy to deal with the extreme value difference. Additionally using a log axis with the bar plot could provide a useful visualization. A downside to the log axis is it may not be fully comprehended with some audiences. That said, I'd prefer to use a Bubble Chart in this case so that I can use the marker size to help illustrate the value's magnitude. A log axis can add further clarity. For convenience I've put the data in a text file and imported via pandas: import pandas as pd df = pd.read_csv("visualization-of-descending-count.txt", delim_whitespace=True)  While the request specifies two seperate plots, a scatter could contain both sets of data and what I've gone with. Further condideration can be given in how to scale the buuble size... either scaled to the max of both groups or the max for each group (see comments in example). 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()   Switching to a log axis: fig.update_layout(xaxis=dict(type='log')) fig.show()   Side note, components-securitySchemes has two entries.