我可以将此数据框转换为折线图吗

问题描述

有什么办法可以将这个数据帧放入一个折线图中,其中每个TypeLoc都有一条单独的线,在Y轴上测量值,并使用熊猫在python中沿x轴运行年份? 我尝试了很多方法,但是对python来说是很新的,所以一无所获。 我花了大约5个小时试图弄清楚,这似乎是问问的最佳地方。

  TESTDATA = StringIO("""DateCode;Value;TypeLoc;Expend_or_Visit;
2014;186;seaside - beach;Expenditure;
2019;1456;Small town;Expenditure;
2016;4916;All areas;Expenditure;
2018;5474;All areas;Expenditure;
2013;217;seaside - beach;Expenditure;
2018;6;seaside - other;Expenditure;
2018;1234;Small town;Expenditure;
2015;230;seaside resort or town;Expenditure;
2016;302;seaside resort or town;Expenditure;
2019;359;seaside resort or town;Expenditure;
2017;458;seaside resort or town;Expenditure;
2015;3922;All areas;Expenditure;
2014;5020;All areas;Expenditure;
2013;4647;All areas;Expenditure;
2016;1037;Small town;Expenditure;
2013;68;seaside - other;Expenditure;
2013;1035;Small town;Expenditure;
2017;46;seaside - beach;Expenditure;
2019;35;seaside - other;Expenditure;
2015;914;Small town;Expenditure;
2016;32;seaside - other;Expenditure;
2016;249;seaside - beach;Expenditure;
2015;36;seaside - other;Expenditure;
2014;128;seaside - other;Expenditure;
2017;75;seaside - other;Expenditure;
2015;81;seaside - beach;Expenditure;
2019;237;seaside - beach;Expenditure;
2018;151;seaside - beach;Expenditure;
2019;457;Village;Expenditure;
2015;308;Village;Expenditure;
2019;3400;City/large town;Expenditure;
2018;3111;City/large town;Expenditure;
2017;1377;Small town;Expenditure;
2017;883;Village;Expenditure;
2014;1398;Small town;Expenditure;
2014;2873;City/large town;Expenditure;
2015;2254;City/large town;Expenditure;
2017;3379;City/large town;Expenditure;
2016;2630;City/large town;Expenditure;
2014;286;seaside resort or town Expenditure;
2013;2850;City/large town;Expenditure;
2013;206;seaside resort or town;Expenditure;
2017;778;Rural countryside;Expenditure;
2016;520;Rural countryside;Expenditure;
2017;5995;All areas;Expenditure;
2019;429;Rural countryside;Expenditure;
2015;402;Rural countryside;Expenditure;
2018;228;seaside resort or town;Expenditure;
2018;502;Rural countryside;Expenditure;
2016;482;Village;Expenditure;
2014;510;Village;Expenditure;
2018;651;Village;Expenditure;
2013;483;Village;Expenditure;
2014;612;Rural countryside;Expenditure;
2019;5777;All areas;Expenditure;
2013;545;Rural countryside;Expenditure;
     """)

链接到完整数据集https://docs.google.com/spreadsheets/d/1bRaq8I3JW6yZ0oucoVaFVH4ldd-HxAUZUBgeUk7KBgs/edit?usp=sharing (我无法将其读入笔记本,因此需要手动输入所有内容。) 数据框1

dataframe

*试图回顾我的代码获取我尝试过的内容- 这是我的最佳尝试,仍然遥遥无期:

df.set_index('TypeLoc',inplace=True)

df_expend = df_expend.transpose()

df_expend = df.query('Expend_or_Visit == "Expenditure"')

import matplotlib.pyplot as plt
df_expend.plot(kind='line')
plt.show()

解决方法

这是一种方法。您需要先旋转数据框,然后再绘制:

df = pd.read_csv(StringIO(TESTDATA),sep=";")
df = df[["DateCode","Value","TypeLoc"]].pivot(index = "DateCode",columns = "TypeLoc")
df = df.droplevel(0,axis=1)
for col in df.columns:
    plt.plot(df.index,df[col],label =col)
plt.show()

样本数据有限的输出为:

enter image description here

要针对较大的数据集(链接中的数据集)运行此代码,请使用:

df = pd.read_csv("scot_stats - Sheet1.csv",header = 1)
df = df[df.Units == "million pounds (GBP)"]

df = df[["DateCode",label =col)
plt.show()

输出如下。您可以通过更改第二行的条件来创建用于访问的单独图表。

enter image description here

,
import pandas as pd
import seaborn as sns
import io

TESTDATA = io.StringIO("""DateCode;Value;TypeLoc;Expend_or_Visit;
2014;186;Seaside - beach;Expenditure;
2019;1456;Small town;Expenditure;
2016;4916;All areas;Expenditure;
2018;5474;All areas;Expenditure;
2013;217;Seaside - beach;Expenditure;
2018;6;Seaside - other;Expenditure;
2018;1234;Small town;Expenditure;
 """)

df = pd.read_csv(TESTDATA,sep =";")

sns.lineplot(x='DateCode',y='Value',hue= 'TypeLoc',data=df)