【问题标题】:Horizontal bar chart visualize one column水平条形图可视化一列
【发布时间】:2021-12-04 11:06:43
【问题描述】:

我正在尝试绘制水平条形图,但是第二个数据列根本没有出现!

df = pd.DataFrame(dict(graph=["Indian","Egyptian","Emirati","Philippino","Syrian","Pakistani","Jordanian",
          "British","Lebanese","American","Chinese","Ukrainian","Canadian","Russian",
          "French","Saudi","Sudanese","Moroccan","Nigerian","Palestinian","German","Iranian",
          "Italian","Turkish","Tunisian"],
                           n=[33060621,28185470,25327222,14033365,13895316,13335555,13067230,9065737,8871022,3914119,3875486,
         3505868,3421358,3407623,3067701,2940321,2824929,2620922,2510789,2439167,1874219,1800495,1852571,1415189,1657462], 
                           m=[13504,13762,9671,4568,4995,8016,6808,5559,5456,4137,2802,1011,2386,1806,4408,2002,1141,1530,916,992,1933,1651,
          1628,1469,839])) 

ind = np.arange(len(df))
width = 0.4

fig, ax = plt.subplots(figsize=(15,20))
ax.barh(ind, df.n, width, color='red', label='N')
ax.barh(ind + width, df.m, width, color='green', label='M')

ax.set(yticks=ind + width, yticklabels=df.graph, ylim=[2*width - 1, len(df)])
ax.legend()

plt.show()

https://drive.google.com/file/d/12TB_pArFWLbCI_ZhePkEfVMpnWxTj885/view?usp=sharing

我需要一些帮助:

  1. 为什么只显示一个数据列而隐藏另一个数据列?
  2. 我可以为每列设置不同的范围吗?比如第一列放上x轴,第二列放下x轴?
  3. 为什么国家名称要改了?

【问题讨论】:

  • m 列的值太小,无法与n 列显示在同一轴上。
  • 一行来统治它们:ax = df.set_index('graph').plot(kind='barh', figsize=(15, 8), logx=True) plot 使用 pandas 1.3.3, matplotlib 3.4.3 直接使用 pandas.DataFrame.plot 绘制数据框。

标签: python pandas matplotlib bar-chart axis


【解决方案1】:
  1. 另一个数据列在图中不可见,因为它的值要小得多。要改变这一点,您可以按比例放大它们的情节,例如1000 倍。
  2. 您可以使用ax.twiny() 在绘图中添加第二个 x 轴,见下文。
  3. y 标签相对于条的显示位置取决于您添加到索引中的width 值。下面的代码显示了一种为每对柱集中它们的方法。
ind = np.arange(len(df))
width = 0.4
scale = 1000

xticks = [0, 10_000_000, 20_000_000, 30_000_000]
limits = [0, 35_000_000]

fig, ax = plt.subplots(figsize=(15,20))

ax.barh(ind + 0.5 * width, df.n, width, color='red', label='N')
ax.barh(ind + 1.5 * width, scale * df.m, width, color='green', label='M')
ax.xaxis.get_major_formatter().set_useOffset(False)
ax.set(yticks=ind + width, yticklabels=df.graph, ylim=[2*width - 1, len(df)],
       xticks=xticks, xticklabels=['0', '10 M', '20 M', '30 M'], xlim=limits)

ax2 = ax.twiny()
ax2.xaxis.get_major_formatter().set_useOffset(False)
ax2.set(xticks=xticks, xticklabels=['0', '10 K', '20 K', '30 K'], xlim=limits)

ax.legend()
plt.show()

【讨论】:

  • 只有红色条 (m) 的顶部 x 轴参考?和绿色的底部?如果是,图表 redear 将如何知道这一点?
  • 这取决于你。如果您想像这样在同一个图中以两个不同的比例进行绘图,则必须添加解释,也许还需要添加额外的视觉线索。我在上面标记刻度的方式,上轴是绿色条,下轴是红色条。我认为这在视觉上是有道理的,因为每个绿色条都在红色条上方。
  • @Arne .. 非常感谢.. 如果我想为访问着色怎么办?例如将标签颜色设置为红色和绿色以便于跟踪?
【解决方案2】:
import plotly.graph_objects as go
from plotly.subplots import make_subplots

fig=make_subplots()   

fig.update_layout(xaxis2={ 'overlaying': 'x', 'side': 'top'})

fig.add_trace(
    go.Bar(name='M', y=df['graph'], x=df.m, orientation='h'))
fig.add_trace(
    go.Bar(name='N', y=df['graph'], x=df.n, orientation='h'))
fig.data[1].update(xaxis='x2')
fig.update_layout(width=700, height=475)

fig.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2017-09-30
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多