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

时间:2019-05-27 14:38:55

标签: python pandas

我正尝试按年份绘制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

问题在于尝试查看对应于哪个国家/地区的行。我尝试了许多不同的方法,最容易区分的似乎是将虚线绘制为虚线。例如(摘要,不完整):

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和可迭代项在一个情节中一起工作
 可迭代-难以在不丢失基础数据的情况下获得唯一国家/地区,但仍存在线路定制问题。

我承认,虽然我有C,C ++和C#的经验,但我是python的新手,而pandas则更多。它要求人们如何思考问题的结构调整。因此,对自定义行和图例应用许多与之大致相似的StackOverflow问题与解答,并不能为那些有更多经验的人提供像这样的解决方案。我希望有人知道答案,这不仅对我有帮助。

更新:在彼得·莱姆比格勒(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)

1 个答案:

答案 0 :(得分:1)

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

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

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

从广义上讲,要想回应黄光昂的评论,很难在没有视觉混乱的情况下在一张图中显示这么多线条。两种可能的解决方法:

  • 按更大的区域(北美和南美,东南亚等)对数据集进行分组,并绘制多个图。
  • 使用Bokeh,Plotly Dash或Holoviews之类的国家/地区缩放,平移和切换来构建交互式线条图。