Python可视化(1):折线图

发布时间:2025-09-02 01:01:59 作者:益华网络 来源:undefined 浏览量(0) 点赞(0)
摘要:摘要: 利用matplotlib绘制横轴为日期格式的折线图时,存在不少技巧。本文借助Tushare包返回的股票数据,介绍日期型折线图绘制的方法。 上一篇文章的最后讲到了折线图的绘制,本文接着进行详细介绍其绘制方法,回顾: Python数据处理分析(

摘要: 利用matplotlib绘制横轴为日期格式的折线图时,存在不少技巧。本文借助Tushare包返回的股票数据,介绍日期型折线图绘制的方法。

上一篇文章的最后讲到了折线图的绘制,本文接着进行详细介绍其绘制方法,回顾:

Python数据处理分析(1):日期型数据处理

折线图绘制的数据源,采用Tushare包获取上市公司基本数据表,格式如下:

1import pandas as

 pd

2data = pd.read(get_stock_basics.csv,encoding = utf8

)

3

print(data.head())

45

ts_code    symbol  name    list_status list_date   is_hs

6000001.SZ    1   平安银行    L   19910403

    S

7000002.SZ    2   万科A L   19910129

    S

8000004.SZ    4   国农科技    L   19910114

    N

9000005.SZ    5   世纪星源    L   19901210

    N

然后利用resample和to.period方法汇总各年度的上市公司数量数据,格式为Pandas.Series数组。

1# 汇总各年上市公司数量 2data = data.set_index([list_date

])

3data = data.resample(AS).count()[ts_code

]

4data = data.to_period(A

)

5

print(data.head())

6

print(data.tail())

7# 结果如下: 8

list_date

91990      7101991      4111992     37121993    106131994     9914

...

15

list_date

162014    124172015    223182016    227192017    438202018     78

1. Series直接绘制折线图

首先,我们可以直接利用pandas的数组Series绘制折线图:

1import matplotlib.pyplot as

 plt

2plt.style.use(ggplot)  # 设置绘图风格 3fig = plt.figure(figsize = (10,6))  # 设置图框的大小 4ax1 = fig.add_subplot(1,1,1

)

5data.plot() # 绘制折线图 6 7# 设置标题及横纵坐标轴标题 8colors1 = #6D6D6D  #设置标题颜色为灰色 9plt.title(历年中国内地上市公司数量变化,color = colors1,fontsize = 18

)

10plt.xlabel(年份

)

11plt.ylabel(数量(家)

)

12

plt.show()

可以发现,图中存在两个问题:一是缺少数值标签,二是横坐标年份被自动分割了。我们希望能够添加上数值标签,然后坐标轴显示每一年的年份值。接下来,需要采用新的方法重新绘制折线图。

2. 折线图完善

1# 创建x,y轴标签 2x = np.arange(0,len(data),1

)

3    ax1.plot(x,data.values, #x、y坐标 4    color = #C42022#折线图颜色为红色 5    marker = o,markersize = 4 #标记形状、大小设置 6

    )

7ax1.set_xticks(x) # 设置x轴标签为自然数序列 8ax1.set_xticklabels(data.index) # 更改x轴标签值为年份 9plt.xticks(rotation=90# 旋转90度,不至太拥挤1011for x,y in

 zip(x,data.values):

12    plt.text(x,y + 10,%.0f %y,ha = center,color = colors1,fontsize = 10

 )

13    # %.0f %y 设置标签格式不带小数14# 设置标题及横纵坐标轴标题15plt.title(历年中国内地上市公司数量变化,color = colors1,fontsize = 18

)

16plt.xlabel(年份

)

17plt.ylabel(数量(家)

)

18# plt.savefig(stock.png,bbox_inches = tight,dpi = 300)19

plt.show()

完善后的折线图如下:

可以看到,x轴逐年的数据都显示并且数值标签也添加上了。

3. 多元折线图

上面介绍了一元折线图的绘制,当需要绘制多元折线图时,方法也很简单,只要重复绘图函数即可。这里我们以二元折线图为例,绘制国内两家知名地产公司万科和保利地产2017年的市值变化对比折线图。

3.1. 数据来源

数据源仍然采用tushare包的pro.daily_basic()接口,该接口能够返回股票的每日股市数据,其中包括每日市值total_mv。我们需获得的两只股票分别是万科地产(000002.SZ)和保利地产(600048.SH),下面就来获取两只股票2017年的市值数据。

1import tushare as

 ts

2ts.set_token(你的token)  # 官网注册后可以获得 3

pro = ts.pro_api()

4def get_stock(): 5

    lst = []

6    ts_codes = [000002.SZ600048.SH

]

7    for ts_code in

 ts_codes:

8

        data = pro.daily_basic(

9            ts_code=ts_code, start_date=20170101, end_date=20180101

)

10

    print(lst)

11

    reutrn lst

12    # 结果如下,total_mv为当日市值(万元):13    #万科地产数据14

        ts_code trade_date  close   …   total_mv    circ_mv

150    000002.SZ   20171229    31.06   …   3.43E+07    3.02E+07161    000002.SZ   20171228    30.7    …   3.39E+07    2.98E+07172    000002.SZ   20171227    30.79   …   3.40E+07    2.99E+07183    000002.SZ   20171226    30.5    …   3.37E+07    2.96E+07194    000002.SZ   20171225    30.37   …   3.35E+07    2.95E+072021    #保利地产数据22

        ts_code trade_date  close   …   total_mv    circ_mv

230    600048.SH   20171229    14.15   …   1.68E+07    1.66E+07241    600048.SH   20171228    13.71   …   1.63E+07    1.61E+07252    600048.SH   20171227    13.65   …   1.62E+07    1.60E+07263    600048.SH   20171226    13.85   …   1.64E+07    1.63E+07274    600048.SH   20171225    13.55   …   1.61E+07    1.59E+07

下面对数据作进一步修改,从DataFrame中提取total_mv列,index设置为日期,再利用resample和pd.to_period方法按月汇总市值数据。

1data[trade_date] = pd.to_datetime(data[trade_date

])

2# 设置index为日期 3data = data.set_index(data[trade_date]).sort_index(ascending=True

)

4# 按月汇总和显示 5data = data.resample(m

)

6

data = data.to_period()

7# 市值改为亿元 8market_value = data[total_mv]/10000 910# 二者结果分别如下,万科地产:112017-01    2291.973270122017-02    2286.331037132017-03    2306.894790142017-04    2266.337906152017-05    2131.053098162017-06    2457.716659172017-07    2686.982164182017-08    2524.462077192017-09    2904.085487202017-10    2976.999550212017-11    3263.374043222017-12    3317.10747423# 保利地产:242017-01    1089.008286252017-02    1120.023350262017-03    1145.731640272017-04    1153.760435282017-05    1108.230609292017-06    1157.276044302017-07    1244.966905312017-08    1203.580209322017-09    1290.706606332017-10    1244.438756342017-11    1336.661916352017-12    1531.150616

3.2. 绘制二元折线图

利用上面的Series数据就可以作图了。

1# 设置绘图风格 2plt.style.use(ggplot

)

3fig = plt.figure(figsize = (10,6

))

4colors1 = #6D6D6D  #标题颜色 5 6# data1万科,data2保利 7data1 = lst[0

]

8data2 = lst[1

]

9# 绘制第一条折线图10

data1.plot(

11color = #C42022#折线图颜色12marker = o,markersize = 4#标记形状、大小设置13label = 万科14

)

15# 绘制第二条折线图16

data2.plot(

17color = #4191C0#折线图颜色18marker = o,markersize = 4#标记形状、大小设置19label = 保利20

)

21# 还可以绘制更多条22# 设置标题及横纵坐标轴标题23plt.title(2017年万科与保利地产市值对比,color = colors1,fontsize = 18

)

24plt.xlabel(月份

)

25plt.ylabel(市值(亿元)

)

26plt.savefig(stock1.png,bbox_inches = tight,dpi = 300

)

27plt.legend() # 显示图例28

plt.show()

绘图结果如下:

如果想添加数值标签,则可以使用下面的代码:

1# 绘制第一条折线图 2# 创建x,y轴标签 3x = np.arange(0,len(data1),1

)

4ax1.plot(x,data1.values, #x、y坐标 5color = #C42022#折线图颜色红色 6marker = o,markersize = 4#标记形状、大小设置 7label = 万科 8

)

9ax1.set_xticks(x) # 设置x轴标签10ax1.set_xticklabels(data1.index) # 设置x轴标签值11# plt.xticks(rotation=90)12for x,y in

 zip(x,data1.values):

13    plt.text(x,y + 10,%.0f %y,ha = center,color = colors1,fontsize = 10

 )

14    # %.0f %y 设置标签格式不带小数1516# 绘制第二条折线图17x = np.arange(0,len(data2),1

)

1819ax1.plot(x,data2.values, #x、y坐标20color = #4191C0#折线图颜色蓝色21marker = o,markersize = 4#标记形状、大小设置22label = 保利23

)

24ax1.set_xticks(x) # 设置x轴标签25ax1.set_xticklabels(data2.index) # 设置x轴标签值26# plt.xticks(rotation=90)27for x,y in

 zip(x,data2.values):

28    plt.text(x,y + 10,%.0f %y,ha = center,color = colors1,fontsize = 10

 )

29    # %.0f %y 设置标签格式不带小数3031# 设置标题及横纵坐标轴标题32plt.title(2017年万科与保利地产市值对比,color = colors1,fontsize = 18

)

33plt.xlabel(月份

)

34plt.ylabel(市值(亿元)

)

3536plt.savefig(stock1.png,bbox_inches = tight,dpi = 300

)

37plt.legend() # 显示图例38

plt.show()

结果如下图所示:

可以看到,两只股票市值从2017年初开始一直在上涨,万科的市值是保利的2倍左右。

本文仅简单提取了两只股票的市值数据,只要你愿意,3000多只股票的数据都可以拿来绘图。

文章代码及素材可在下面链接中获得:

https://github.com/makcyun/web_scraping_with_python/tree/master/date_plot

另外,后期可能会在我的博客中不断更新、补充本文的内容。如想获得更多该方面的知识,可点击阅读原文,或者浏览器打开我的博客链接。

https://www.makcyun.top/

本文完。

二维码

扫一扫,关注我们

声明:本文由【益华网络】编辑上传发布,转载此文章须经作者同意,并请附上出处【益华网络】及本页链接。如内容、图片有任何版权问题,请联系我们进行处理。

感兴趣吗?

欢迎联系我们,我们愿意为您解答任何有关网站疑难问题!

您身边的【网站建设专家】

搜索千万次不如咨询1次

主营项目:网站建设,手机网站,响应式网站,SEO优化,小程序开发,公众号系统,软件开发等

立即咨询 15368564009
在线客服
嘿,我来帮您!