• python-----matplotlib详细教程(未完...)


    文章每个图都带有案例,欢迎访问!!!

    目录

    如何选择合适的图表

    绘制简单的折线图 

    图表常用设置

    颜色设置

    线条样式和标记样式

    画布设置 

     设置坐标轴标题

    plt.rcParams['font.sans-serif']=['SimHei']解决缺失字体

     设置坐标轴刻度

    设置坐标轴范围

     设置网格线

    添加文本标签和标题

    添加图例

    添加注释

    设置图表与画布边缘间距

    设置刻度线 

    折线图

    案例:台湾疫情数据增长折线图

    基本柱状图

     案例:每日新增疫情数

    多柱状图

    直方图 

    饼形图

    基本饼形图

    分裂饼形图

    环形饼图

    散点图 

    面积图

    ​热力图

    箱型图

    ​绘制多个子图三种方式

    ​subplot

    ​subplots

    add_subplot()

    图表的保存


    如何选择合适的图表

    绘制简单的折线图 

    matplotlib.pyplot.plot(x,y,format_string,**kwargs)

    1. import matplotlib.pyplot as plt
    2. import pandas as pd
    3. s=pd.date_range(start='2022-08-02',freq='D',periods=10)
    4. df=pd.DataFrame(data=[30,29,33,38,28,26,31,24,19,25],index=s,columns=['温度'])
    5. x=s
    6. y=df['温度']
    7. plt.plot(x,y)
    8. plt.show()

    图表常用设置

    颜色设置

    import matplotlib.pyplot as plt

    x=[1,2,3,4,5]

    y=[10,15,20,25,30]

    plt.plot(x,y,color='r')

    y=[5,20,25,30,40]

    plt.plot(x,y,color='g')

    y=[10,20,30,40,50]

    plt.plot(x,y,color='b')

    y=[1,20,40,60,80]

    plt.plot(x,y,color='y')

    plt.show()

    线条样式和标记样式

     plt.plot(x,y,color='b',linestyle='-',marker='o',mfc='w')

    mfc='w'使样式标记变成空心

    import matplotlib.pyplot as plt

    x=[1,2,3,4,5]

    y=[10,15,20,25,30]

    plt.plot(x,y,color='r',linestyle='--')

    y=[5,20,25,30,40]

    plt.plot(x,y,color='g',linestyle='-')

    y=[10,20,30,40,50]

    plt.plot(x,y,color='b',linestyle='-.')

    y=[1,20,40,60,80]

    plt.plot(x,y,color='y',linestyle=':')

    plt.show()

     import matplotlib.pyplot as plt

    x=[1,2,3,4,5]

    y=[10,15,20,25,30]

    plt.plot(x,y,color='r',linestyle='--',marker='o')

    plt.show()

     plt.plot(x,y,color='b',linestyle='-',marker='o',mfc='w')

    画布设置 

    import matplotlib.pyplot as plt

    plt.figure(num='画布',figsize=(8,6),facecolor='y')

    plt.show()

     设置坐标轴标题

    - xlabel函数设置x轴坐标轴标题, ylabel函数设置

    import matplotlib.pyplot as plt

    import pandas as pd

    plt.figure(num='温度',figsize=(10,4),facecolor='y')

    s=pd.date_range(start='2022-08-02',freq='D',periods=10)

    df=pd.DataFrame(data=[30,29,33,38,28,26,31,24,19,25],index=s,columns=['温度'])

    x=s

    y=df['温度']

    plt.rcParams['font.sans-serif']=['SimHei']解决缺失字体

    plt.title('天气预报')

    plt.xlabel('日期')

    plt.ylabel('温度')

    plt.plot(x,y,marker='o',mfc='w')

    plt.show()

     设置坐标轴刻度

    plt.xticks()

    plt.yticks() 

    import matplotlib.pyplot as plt

    import random

    plt.rcParams['font.sans-serif']=['KaiTi']

    month=[str(i)+'月' for i in range(1,11)]

    x=[i for i in range(1,11)]

    y=[random.randint(1,10) for i in range(10)]#包含10

    plt.xticks(range(1,11),month)

    plt.yticks(range(1,11))

    plt.plot(x,y,marker='o')

    plt.show()

    设置坐标轴范围

    xlim函数设置x轴坐标轴范围,ylim函数设置y轴坐标轴范围

    import matplotlib.pyplot as plt

    import random

    plt.rcParams['font.sans-serif']=['KaiTi']

    month=[str(i)+'月' for i in range(1,11)]

    x=[i for i in range(1,11)]

    y=[random.randint(1,10) for i in range(10)]#包含10

    plt.xticks(range(1,11),month)

    plt.yticks(range(1,11))

    plt.xlim(1,20)

    plt.ylim(1,20)

    plt.plot(x,y,marker='o')

    plt.show()

     设置网格线

    plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')#x y both

    import matplotlib.pyplot as plt

    import random

    plt.rcParams['font.sans-serif']=['KaiTi']

    month=[str(i)+'月' for i in range(1,11)]

    x=[i for i in range(1,11)]

    y=[random.randint(1,10) for i in range(10)]#包含10

    plt.xticks(range(1,11),month)

    plt.yticks(range(1,11))

    plt.plot(x,y,marker='o')

    plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')#x y both

    plt.show()

    添加文本标签和标题

    plt.text()

    plt.title()

    添加图例

    plt.legend(('销售次数',))

     #

    import matplotlib.pyplot as plt

    import random

    plt.rcParams['font.sans-serif']=['KaiTi']

    month=[str(i)+'月' for i in range(1,11)]

    x=[i for i in range(1,11)]

    y=[random.randint(1,10) for i in range(10)]#包含10

    plt.xticks(range(1,11),month)

    plt.yticks(range(1,11))

    for a,b in zip(x,y):

            plt.text(a,b,(a,b),color='r',ha='center',fontsize='10')

    plt.title('测试练习',fontsize='15',color='b')

    plt.plot(x,y,marker='o',mfc='w')

    plt.legend(('销售次数',))

    plt.show()

    添加注释

    matplotlib.pyplot.annotate(s,xy,xytext,xycoords,arrowprops) 

     import matplotlib.pyplot as plt

    plt.rcParams['font.sans-serif']=['KaiTi']

    month=[str(i)+'月' for i in range(1,11)]

    x=[1,2,3,4,5,6]

    y=[10,18,32,47,8,26]

    for a,b in zip(x,y):

             plt.text(a,b,b,color='r',ha='center',fontsize='10')

    plt.title('测试练习',fontsize='15',color='b')

    plt.plot(x,y,marker='o',mfc='w')

    plt.annotate('最大数',xy=(4,47),xytext=(5,47),arrowprops={'facecolor':'y','shrink':0.05}) plt.show()

    设置图表与画布边缘间距

    matplotlib.pyplot.subplots_adjust(left,right,top,bottom)

    plt.subplots_adjust(left=0.1,right=0.9,bottom=0.09,top=0.9)

    设置刻度线 

    plt.tick_params(bottom=True,left=True,right=True,top=True)#True显示刻度线

    plt.rcParams['xtick.direction'] = 'in'  # 将x周的刻度线方向设置向内
    plt.rcParams['ytick.direction'] = 'in'  # 将y轴的刻度方向设置向内
    plt.rcParams['xtick.direction'] = 'out'  # 将x周的刻度线方向设置向外
    plt.rcParams['ytick.direction'] = 'out'  # 将y轴的刻度方向设置向内外
    plt.rcParams['xtick.direction'] = 'inout'  # 将x周的刻度线方向设置向中间
    plt.rcParams['ytick.direction'] = 'inout'  # 将y轴的刻度方向设置向中间

    常用图表—折线图

    案例:台湾疫情数据增长折线图

    准备数据:通过爬虫获取20200122到今天为止每日的新增病例数量,得到按季度增加的病例数量绘图。

    数据文件地址:https://file1.dxycdn.com/2020/0223/045/3398299749526003760-135.json

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. df=pd.read_csv('tw.csv')
    4. for i in range(0,909):
    5. for j in range(0,1):
    6. df.iloc[i,j]=str(df.iloc[i,j])
    7. df['dateId']=pd.to_datetime(df['dateId'])
    8. df=df.set_index('dateId')
    9. df=df.resample('Q').sum().to_period('Q')
    10. plt.figure('简单折线图',figsize=(8,6),facecolor='y',)
    11. x=['2020Q1','2020Q2','2020Q3','2020Q4','2021Q1','2021Q2','2021Q3','2021Q4','2022Q1','2022Q2', '2022Q3']
    12. y=list(df['confirmedIncr'])
    13. plt.plot(x, y, color='b', linestyle='-', marker='o', mfc='w')
    14. plt.xlabel('季度')
    15. plt.ylabel('新增数量')
    16. for a,b in zip(x,y):
    17. plt.text(a,b,b,color='r',ha='center',fontsize='10')
    18. plt.title('疫情新增趋势按季度')
    19. plt.rcParams['font.sans-serif']=['SimHei']
    20. plt.grid(color='0.5',linestyle='--',linewidth='1',axis='both')
    21. plt.subplots_adjust(left=0.1,right=0.9,bottom=0.09,top=0.9)
    22. plt.show()

    常用图表-基本柱状图

     案例:每日新增疫情数

    1. import numpy as np
    2. import pandas as pd
    3. import matplotlib.pyplot as plt
    4. import json
    5. import requests
    6. from lxml import etree
    7. plt.rcParams['font.sans-serif'] = ['KaiTi']
    8. url = "https://ncov.dxy.cn/ncovh5/view/pneumonia?from=timeline&isappinstalled=0"
    9. headers={
    10. 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36 Edg/98.0.1108.62',
    11. }
    12. res = requests.get(url=url,headers=headers)
    13. res.encoding = "utf-8"
    14. content = res.text
    15. html = etree.HTML(content)
    16. con = html.xpath('//*[@id="fetchRecentStatV2"]/text()')
    17. con = str(con)
    18. begin = con.index("[{")
    19. end = con.index("}catch(e){}']")
    20. con = con[begin : end]
    21. ls = json.loads(con)
    22. # ==============================绘图====================================================
    23. df_data = pd.DataFrame.from_dict(ls)
    24. print(df_data)
    25. def btxzzt():
    26. ls_provinceShortName = [] # 省份
    27. ls_yesterdayLocalConfirmedCount= [] # 本土新增确诊
    28. for x in ls:
    29. provinceShortName = x["provinceShortName"]
    30. yesterdayLocalConfirmedCount = x["yesterdayLocalConfirmedCount"]
    31. ls_provinceShortName.append(provinceShortName)
    32. ls_yesterdayLocalConfirmedCount.append(yesterdayLocalConfirmedCount)
    33. x = np.array(ls_provinceShortName)
    34. y = np.array(ls_yesterdayLocalConfirmedCount)
    35. plt.figure('基本柱状图',figsize=(8,6),facecolor='y')
    36. plt.title("近期风险地区疫情本土新增")
    37. plt.xlabel("省份")
    38. plt.ylabel("人数")
    39. plt.yticks(range(0,99))
    40. for i,j in zip(range(len(y)), y):
    41. plt.text(i, j, j)#(i,j)表示添加标签的位置,j表示添加的内容
    42. plt.grid(color='0.5', linestyle='--', linewidth='1', axis='y')
    43. plt.subplots_adjust(left=0.1, right=0.9, bottom=0.09, top=0.9)
    44. plt.bar(x, y,width=0.8,alpha=0.5,color='g')
    45. plt.show()
    46. btxzzt()

     多柱状图

    主要代码:

      w=0.2

    plt.bar(x, y1,width=0.2,color='g',alpha=0.5)
    plt.bar(x+w, y2,width=0.2,color='r',alpha=0.5)
    plt.bar(x+2*w, y3,width=0.2,color='b',alpha=0.5)
    plt.bar(x+3*w, y4,width=0.2,color='y',alpha=0.5)

     

    1. import pandas as pd
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. df=pd.read_excel('多柱状图.xlsx')
    5. plt.figure('多柱状图',facecolor='y',figsize=(10,7))
    6. x=np.array([1,2,3,4,5,6,7])
    7. y1=df['1月']+df['2月']+df['3月']
    8. y2=df['4月']+df['5月']+df['6月']
    9. y3=df['7月']+df['8月']+df['9月']
    10. y4=df['10月']+df['11月']+df['12月']
    11. plt.xlabel('产品')
    12. plt.ylabel('季度销售量')
    13. w=0.2
    14. for i,j in zip(x, y1):
    15. plt.text(i,j,j,ha='center',color='g')
    16. for i, j in zip(x, y2):
    17. plt.text(i+0.2, j, j, ha='center', color='r')
    18. for i, j in zip(x, y3):
    19. plt.text(i+0.4, j, j, ha='center', color='b')
    20. for i, j in zip(x, y4):
    21. plt.text(i+0.6, j, j, ha='center', color='y')
    22. plt.rcParams['font.sans-serif']=['SimHei']
    23. plt.bar(x, y1,width=0.2,color='g',alpha=0.5)
    24. plt.bar(x+w, y2,width=0.2,color='r',alpha=0.5)
    25. plt.bar(x+2*w, y3,width=0.2,color='b',alpha=0.5)
    26. plt.bar(x+3*w, y4,width=0.2,color='y',alpha=0.5)
    27. data=df['产品名称']
    28. plt.xticks(x,data)
    29. plt.legend(['第一季度','第二季度','第三季度','第四季度'])
    30. plt.subplots_adjust(left=0.08, right=0.98, bottom=0.09, top=0.95)
    31. plt.show()

    直方图 

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. df=pd.DataFrame(data={
    4. '总成绩':[61,71,89,74,36,25,86,73,84,86,87]
    5. })
    6. plt.rcParams['font.sans-serif']=['KaiTi']
    7. x=df['总成绩']
    8. plt.xlabel('分数')
    9. plt.ylabel('人数')
    10. plt.title('直方图')
    11. bins=[0,10,20,30,40,50,60,70,80,90,100]
    12. plt.xticks(bins)
    13. plt.hist(x,bins,facecolor='g',edgecolor='k')
    14. plt.show()

     饼形图

    基本饼形图

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. pd.set_option('display.unicode.east_asian_width', True)
    4. s=pd.DataFrame(data={
    5. '商品名':['小米手机','华为手机','华为电脑','小米电脑'],
    6. '销量':[400,200,50,60]
    7. })
    8. plt.rcParams['font.sans-serif']=['KaiTi']
    9. x=s['销量']
    10. labels=s['商品名']
    11. plt.pie(x,labels=labels,autopct='%1.1f%%',labeldistance=1.05,textprops={'fontsize':12})
    12. #保证饼形图为圆形
    13. plt.axis('equal')
    14. plt.legend(labels,fontsize='10')
    15. plt.show()

    分裂饼形图

    通过在绘制基本饼图中加一个参数explode=(0.1,0,0,0)实现

    shadow=True使饼图带有阴影效果,有层次感

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. pd.set_option('display.unicode.east_asian_width', True)
    4. s=pd.DataFrame(data={
    5. '商品名':['小米手机','华为手机','华为电脑','小米电脑'],
    6. '销量':[400,200,50,60]
    7. })
    8. plt.rcParams['font.sans-serif']=['KaiTi']
    9. x=s['销量']
    10. labels=s['商品名']
    11. plt.pie(x,labels=labels,autopct='%1.1f%%',labeldistance=1.05,textprops={'fontsize':12},explode=(0.1,0,0,0),shadow=True)
    12. #保证饼形图为圆形
    13. plt.axis('equal')
    14. plt.legend(labels,fontsize='10')
    15. plt.show()

     

    环形饼图

    通过参数wedgeprops实现

    若要绘制内嵌环形饼图通过设置半径radius实现

    1. import pandas as pd
    2. import matplotlib.pyplot as plt
    3. pd.set_option('display.unicode.east_asian_width', True)
    4. s=pd.DataFrame(data={
    5. '商品名':['小米手机','华为手机','华为电脑','小米电脑'],
    6. '北京销量':[400,200,50,60],
    7. '上海销量':[299,386,79,67]
    8. })
    9. plt.rcParams['font.sans-serif']=['KaiTi']
    10. x=s['北京销量']
    11. x1=s['上海销量']
    12. color=['y','g','r','b']
    13. labels=s['商品名']
    14. plt.pie(x,labels=labels,autopct='%1.1f%%',colors=color,labeldistance=1.05,radius=1,pctdistance=0.85,textprops={'fontsize':12},wedgeprops={'width':0.4,'edgecolor':'w'})
    15. plt.pie(x1,autopct='%1.1f%%',colors=color,labeldistance=1.05,radius=0.7,pctdistance=0.85,textprops={'fontsize':12},wedgeprops={'width':0.4,'edgecolor':'w'})
    16. plt.legend(labels,fontsize='10',frameon=False)
    17. #保证饼形图为圆形
    18. plt.axis('equal')
    19. plt.show()

     

    散点图 

    1. import matplotlib.pyplot as plt
    2. import random
    3. x=[i for i in range(1,11)]
    4. y=[random.randint(1,11) for i in range(1,11)]
    5. plt.scatter(x,y,color='r')
    6. plt.show()

    面积图

    案例中的数据是自己拟的

    1. import matplotlib.pyplot as plt
    2. import pandas as pd
    3. df=pd.read_excel('多柱状图.xlsx')
    4. plt.rcParams['font.sans-serif']=['KaiTi']
    5. x=df['产品名称']
    6. y1=df['1月']+df['2月']+df['3月']
    7. y2=df['4月']+df['5月']+df['6月']
    8. y3=df['7月']+df['8月']+df['9月']
    9. y4=df['10月']+df['11月']+df['12月']
    10. plt.stackplot(x,y1,y2,y3,y4)
    11. plt.legend(['第一季度','第二季度','第三季度','第四季度'])
    12. plt.show()

    热力图

    1. import matplotlib.pyplot as plt
    2. import pandas as pd
    3. import random
    4. df=pd.DataFrame(data={
    5. '姓名':['小明','小红','张三','李四','小虎'],
    6. '语文':[random.randint(80,150) for i in range(5)],
    7. '数学':[random.randint(80,150) for i in range(5)],
    8. '英语':[random.randint(80,150) for i in range(5)]
    9. })
    10. plt.rcParams['font.sans-serif']=['KaiTi']
    11. x=df.loc[:,'语文':]
    12. plt.yticks(range(5),df['姓名'])
    13. plt.xticks(range(3),['语文','数学','英语'])
    14. plt.title('学生成绩热力图')
    15. plt.imshow(x)
    16. plt.colorbar()#显示颜色条
    17. plt.show()

     箱型图

     绘制多个子图三种方式

     subplot

    1. import matplotlib.pyplot as plt
    2. import random
    3. #绘制第一个子图
    4. plt.subplot(2,2,1)
    5. plt.plot([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
    6. #绘制第一个子图
    7. plt.subplot(2,2,2)
    8. plt.scatter([1,2,3,4,5],[random.randint(1,10) for i in range(5)],color='r')
    9. #绘制第一个子图
    10. plt.subplot(2,1,2)
    11. plt.bar([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
    12. plt.show()

    subplots

    1. import matplotlib.pyplot as plt
    2. import random
    3. figure,axes=plt.subplots(2,2)#两行两列
    4. # 第一个绘图区
    5. axes[0,0].plot([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
    6. # 第二个绘图区
    7. axes[0,1].scatter([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
    8. # 第三个绘图区
    9. axes[1,0].bar([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
    10. # 第四个绘图区
    11. axes[1,1].pie([random.randint(1,10) for i in range(5)],autopct='%1.1f%%')
    12. plt.show()

     add_subplot()

    1. import matplotlib.pyplot as plt
    2. import random
    3. fig=plt.figure()
    4. #绘制第一个子图
    5. ax1=fig.add_subplot(2,2,1)
    6. ax1.plot([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
    7. #绘制第二个子图
    8. ax2=fig.add_subplot(2,2,2)
    9. ax2.scatter([1,2,3,4,5],[random.randint(1,10) for i in range(5)],color='r')
    10. #绘制第三个子图
    11. ax3=fig.add_subplot(2,2,3)
    12. ax3.bar([1,2,3,4,5],[random.randint(1,10) for i in range(5)])
    13. # 绘制第四个
    14. ax4=fig.add_subplot(2,2,4)
    15. ax4.pie([random.randint(1,10) for i in range(5)],autopct='%1.1f%%')
    16. plt.show()

     图表的保存

    plt.savefig('demo.png')

  • 相关阅读:
    MySQL 主从同步(读写分离)
    Go网络请求中配置代理
    pytorch基础学习(2)
    After Effects 2024 v24.0.2(AE2024)
    tokenizers pre_tokenizers模块
    介绍 CI / CD
    Java Collection集合
    java基础题--数组
    VBA 浏览文件夹对话框调用的几种方法
    LVS-NAT模式【案例实验】
  • 原文地址:https://blog.csdn.net/weixin_54824895/article/details/126127616