使用循环使用自定义线格式绘制大型数据集的强健解决方案

2024-10-03 17:19:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正试图从Comparative Political Data Set中按年份绘制人口和国家数据图。例:

year    country   pop15_64   
1960  Australia    6296.50
1961  Australia    6428.60
1962  Australia    6571.50
1960        USA  107919.4
1961        USA  109048.6
1962        USA  111177.3

问题在于,要想知道哪条线对应于哪个国家。我尝试了许多不同的方法,最容易区分的方法似乎是将直线绘制为虚线。Ex(代码段,不完整):

df2.loc[df2['country'] == 'Cyprus'].plot(x='year', y='pop15_64', ax=ax, color='k')
df2.loc[df2['country'] == 'Czech Republic'].plot(x='year', y='pop15_64', ax=ax, color='g', dashes=[3, 3])

结果图: Country Population hardcoded lines

但上述情况并不可靠。添加到数据集需要硬编码另一行,删除国家也是如此。这将有力地在数据上循环:

fig, ax = plt.subplots()
plt.xlabel('Year')
plt.ylabel('Population')
for countries in df2['country'].unique():
     df2[df2['country']==countries].plot.line(x='year',
                                              y='pop15_64',
                                              ax=ax,
                                              label=countries,
                                              title='Country Population by Year')

ax.legend(handlelength=5)
plt.show()

结果图: Country Population with Loops

…但我认为没有办法在这些循环中自定义行而不中断它。例如,这:

for countries, x in df2['country'].unique():
     df2[df2['country']==countries].plot.line(x='year',
                                              y='pop15_64',
                                              ax=ax,
                                              dashes=[x+2, x],
                                              label=countries,
                                              title='Country Population by Year')

…导致出现“ValueError:太多值无法解压缩(预期为2)”

我还尝试了什么:
.groupby-无法让groupby和iterables在一个绘图中一起工作
iterables—在不丢失基础数据的情况下,很难获得独特的国家/地区,仍然存在线路定制问题

我承认,虽然我有C、C++和C语言的经验,但我是Python的新手,更喜欢熊猫。它要求人们重新思考问题的方式。因此,应用许多模糊相似的StackOverflow Q&;关于自定义线条和图例的讨论并没有像对经验丰富的人那样产生解决方案。我希望有人知道答案,这可能不仅仅对我有帮助

更新:在Peter Leimbigler的回答之后,我对上述内容进行了修改,以实现此暂定解决方案:

for i, countries in enumerate(df2['country'].unique()):
     df2[df2['country']==countries].plot.line(x='year',
                                              y='pop15_64',
                                              ax=ax,
                                              dashes=[3+i, i/2, abs(i-2), i/2],
                                              label=countries)

Tags: 数据plotplt国家axyearcountrycountries
1条回答
网友
1楼 · 发布于 2024-10-03 17:19:55

我建议您对在循环中更改破折号属性的尝试进行以下更改:

for i, countries in enumerate(df2['country'].unique()):

这将需要进一步的风格调整,但应该是一个良好的起点

更广泛地说,与广亨的评论相呼应的是,在一个情节上呈现这么多的线条而不造成视觉上的混乱是非常困难的。两种可能的解决办法:

  • 按更大的区域(北部和北部)对数据集进行分组;南美洲、东南亚等)并建造若干地块
  • 在Bokeh、Plotly Dash或Holoviews中,通过国家/地区的缩放、平移和切换构建交互式线条图

相关问题 更多 >