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

Python 使用循环使用自定义线格式绘制大型数据集的强健解决方案,python,pandas,Python,Pandas,我正试图从统计数据中按年份绘制人口和国家数据图。例: 问题在于,要想知道哪条线对应于哪个国家。我尝试了许多不同的方法,最容易区分的方法似乎是将直线绘制为虚线。Ex(代码段,不完整): 结果图: 但上述情况并不可靠。添加到数据集需要硬编码另一行,删除国家也是如此。这将有力地在数据上循环: fig, ax = plt.subplots() plt.xlabel('Year') plt.ylabel('Population') for countries in df2['country'].uniq

我正试图从统计数据中按年份绘制人口和国家数据图。例:

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

结果图:

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

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()
结果图:

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

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&a并没有产生像对更有经验的人那样的解决方案。我希望有人知道答案,这可能不仅仅对我有帮助

更新:在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)

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

for i, countries in enumerate(df2['country'].unique()):
这将需要进一步的风格调整,但应该是一个良好的起点

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

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

老实说,我看不到在同一轴线上绘制20条线的点。@Quanghaang看第一张图。你看到异常值了吗?对于各种类型的数据,这些信息都很有用。在第二张图中,您如何判断哪一行是异常值?非常感谢您的快速响应!Re:QH对我的OP的评论,我理解这是一个令人困惑的图表,但对于我在这个数据集上处理的变量数量来说,在某些情况下这是必要的。农村人口只是为了这个问题。有时,在一张图上更容易发现异常值。尽管如此,我感谢这些建议,并将铭记在心。我将仔细研究一下Bokeh等。我一直在寻找一种比基本matplotlib更具交互性的方法。@LabGecko很乐意提供帮助!我从你的另一个评论中看到,你的目标是快速识别异常值,在这种情况下,给每个国家一条独特的线是有意义的,即使它们中的一组最终是相互重叠的。
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)
for i, countries in enumerate(df2['country'].unique()):