鱼C论坛

 找回密码
 立即注册
查看: 1648|回复: 12

高中生比赛求救急急急

[复制链接]
发表于 2020-6-19 23:07:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. import matplotlib.pyplot as plt
  2. import random
  3. import pandas as pd
  4. import pickle
  5. import matplotlib.ticker as ticker
  6. import matplotlib.animation as animation
  7. def randomcolor():#颜色随机生成
  8.     colorlist = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
  9.     color =''
  10.     for i in range(6):
  11.         color += random.choice(colorlist)
  12.     return '#'+ color
  13. def get_pandafile():
  14.     data0 = pd.read_excel('china_provincedata.xlsx', sheet_name='china_provincedata',usecols=['provinceShortName','累计确诊','dateId'])
  15.     pickle_file = open('pdfile.pkl','wb')
  16.     pickle.dump(data0,pickle_file)
  17.     pickle_file.close()

  18. def load_data():
  19.     pickle_file = open('pdfile.pkl','rb')
  20.     pdfile = pickle.load(pickle_file)
  21.     return pdfile
  22. df=load_data()
  23. def get_colordict():


  24.     area_list1 = set(df['provinceShortName'])
  25.     color_list = []
  26.     for i in range(len(area_list1)):
  27.         str_1 = randomcolor()
  28.         color_list.append(str_1)
  29.         str_1 = randomcolor()
  30.     area_list2 = [i for i in area_list1]

  31.     color_dict = dict(zip(area_list2,color_list))
  32.     return color_dict

  33. def illpeople(current_day):
  34.     fig, ax = plt.subplots(figsize=(15, 8))
  35.     dff = df[df['dateId'].eq(current_day)].sort_values(by='累计确诊', ascending=True).tail(12)
  36.     ax.clear()
  37.     ax.barh(dff['provinceShortName'],dff['累计确诊'],color = [get_colordict()[x] for x in dff['provinceShortName']])
  38.     dx = dff['累计确诊'].max()/200
  39.     for i, (value, name) in enumerate(zip(dff['累计确诊'], dff['provinceShortName'])):
  40.         ax.text(value - dx, i, name, size=14, weight=600, ha='right', va='bottom')

  41.         ax.text(value + dx, i, f'{value:,.0f}', size=14, ha='left', va='center')
  42.     ax.text(1, 0.4, current_day, transform=ax.transAxes, color='#777777', size=46, ha='right', weight=800)
  43.     ax.text(0, 1.06, 'Number of people', transform=ax.transAxes, size=12, color='#777777')

  44.     # set_major_formatter表示刻度尺格式;
  45.     ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))
  46.     ax.xaxis.set_ticks_position('top')
  47.     ax.tick_params(axis='x', colors='#777777', labelsize=12)
  48.     ax.set_yticks([])
  49.     # margins表示自动缩放余额;
  50.     ax.margins(0, 0.01)
  51.     # 设置后面的网格
  52.     ax.grid(which='major', axis='x', linestyle='-')
  53.     # 刻度线和网格线是在图标上方还是下方,True为下方
  54.     ax.set_axisbelow(True)
  55.     ax.text(0, 1.15, 'Number of people infected with the COVID-19',
  56.             transform=ax.transAxes, size=24, weight=600, ha='left', va='top')
  57.     ax.text(1, 0, 'by@Baoheng Zhu', transform=ax.transAxes, color='#777777', ha='right',
  58.             bbox=dict(facecolor='white', alpha=0.8, edgecolor='white'))
  59.     # 取消图表周围的方框显示
  60.     plt.box(False)

  61. fig, ax = plt.subplots(figsize=(15, 8))




  62. if __name__ == '__main__':
  63.     randomcolor()
  64.     get_pandafile()
  65.     load_data()
  66.     get_colordict()
  67.     fig=illpeople(20200122)
  68.     animator = animation.FuncAnimation(fig, illpeople, frames=range(20200122, 20200608))
  69.     plt.show()
复制代码

如题,省里组织python竞赛,说可以借鉴他人代码,我就在网上找了一个课题,自己改编,但是赛事要求只能用matplotlib
库,我要做的是新冠疫情动态图,没有ipython,没办法动,只能呈现一张图片,各位大神快来帮帮我吧,怎么才能用matploblib自身显示动画呢,跪谢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-20 00:37:41 | 显示全部楼层


你参考这个代码吧,我也是去隔壁度娘搬运来的,这个就算动态的图了:

  1. import matplotlib.pyplot as plt
  2. import numpy as np

  3. ax=[]   #保存图1数据
  4. ay=[]
  5. bx=[]   #保存图2数据
  6. by=[]
  7. num=0   #计数
  8. plt.ion()    # 开启一个画图的窗口进入交互模式,用于实时更新数据
  9. # plt.rcParams['savefig.dpi'] = 200 #图片像素
  10. # plt.rcParams['figure.dpi'] = 200 #分辨率
  11. plt.rcParams['figure.figsize'] = (10, 10)        # 图像显示大小
  12. plt.rcParams['font.sans-serif']=['SimHei']   #防止中文标签乱码,还有通过导入字体文件的方法
  13. plt.rcParams['axes.unicode_minus'] = False
  14. plt.rcParams['lines.linewidth'] = 0.5   #设置曲线线条宽度
  15. while num<100:
  16.     plt.clf()    #清除刷新前的图表,防止数据量过大消耗内存
  17.     plt.suptitle("总标题",fontsize=30)             #添加总标题,并设置文字大小
  18.     g1=np.random.random()  #生成随机数画图
  19. #图表1
  20.     ax.append(num)      #追加x坐标值
  21.     ay.append(g1)       #追加y坐标值
  22.     agraphic=plt.subplot(2,1,1)
  23.     agraphic.set_title('子图表标题1')      #添加子标题
  24.     agraphic.set_xlabel('x轴',fontsize=10)   #添加轴标签
  25.     agraphic.set_ylabel('y轴', fontsize=20)
  26.     plt.plot(ax,ay,'g-')                #等于agraghic.plot(ax,ay,'g-')
  27. #图表2
  28.     bx.append(num)
  29.     by.append(g1)
  30.     bgraghic=plt.subplot(2, 1, 2)
  31.     bgraghic.set_title('子图表标题2')
  32.     bgraghic.plot(bx,by,'r^')

  33.     plt.pause(0.4)     #设置暂停时间,太快图表无法正常显示
  34.     if num == 15:
  35.         plt.savefig('picture.png', dpi=300)  # 设置保存图片的分辨率
  36.         #break
  37.     num=num+1

  38. plt.ioff()       # 关闭画图的窗口,即关闭交互模式
  39. plt.show()       # 显示图片,防止闪退
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-20 01:19:35 | 显示全部楼层
本帖最后由 java2python 于 2020-6-20 03:39 编辑

你的程序想表达的数据,可能比较复杂,真的不懂,下面代码是反应每天前五位省份的数据变动情况的(当然由于其他省份和湖北比比例很小,看上去变动不明显):
  1. import matplotlib.pyplot as plt
  2. import numpy as np
  3. from matplotlib import animation
  4. import pickle

  5. def load_data():
  6.     pickle_file = open('pdfile.pkl','rb')
  7.     pdfile = pickle.load(pickle_file)
  8.     return pdfile

  9. start_day = 20200122
  10. month_day=[0,31,29,31,30,31,30]
  11. def all_day(start,end):
  12.     days = []
  13.     cur_day = start
  14.     while cur_day < end:
  15.         mon = (cur_day//100) % 100
  16.         day = cur_day % 100
  17.         if day == month_day[mon]:
  18.             mon += 1
  19.             day = 1
  20.         else:
  21.             day +=1
  22.         cur_day = 20200000+mon*100+day
  23.         days.append(cur_day)
  24.     return days
  25. days = all_day(20200122,20200608)

  26. fig=plt.figure(1,figsize=(4,3))
  27. ax=fig.add_subplot(111)
  28. ax.set_title('bar_animate_test')
  29. ax.set_xlabel('xlable')
  30. N=5
  31. frames=len(days)
  32. x=np.arange(1,N+1)

  33. df=load_data()
  34. collection=[]
  35. collection.append([i for i in x])
  36. for i in range(frames):
  37.     dff = df[df['dateId'].eq(days[i])].sort_values(by='confirmedCount', ascending=True).tail(5)
  38.     ax.clear()
  39.     c=[]
  40.     for l, (value, name) in enumerate(zip(dff['confirmedCount'], dff['provinceShortName'])):
  41.         c.append(value)

  42.     collection.append(c)
  43. print(collection)
  44. xstd=[0,1,2,3,4]
  45. bars=ax.bar(x,collection[0],0.30)
  46. def animate(fi):
  47.     ax.set_ylim(0,max(collection[fi])+3)
  48.     for rect ,yi in zip(bars,collection[fi]):
  49.         rect.set_height(yi)
  50.     return bars
  51. anim=animation.FuncAnimation(fig,animate,frames=frames,interval=300,repeat=False)
  52. plt.show()
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-20 13:01:21 | 显示全部楼层
你的程序,应该是拷贝Bar Chart Race(条形竞赛图) in Python with Matplotlib
https://zhuanlan.zhihu.com/p/94331647
可能他也发表在别的网站,但作者就是他。以下代码是能够动态表示的,只是有乱码

  1. #导入工具包
  2. import pandas as pd
  3. import matplotlib.pyplot as plt
  4. import matplotlib.ticker as ticker
  5. import matplotlib.animation as animation
  6. #from IPython.display import HTML
  7. import random

  8. df = pd.read_csv('china_provincedata.csv', usecols=['provinceName', 'provinceShortName', 'dateId', 'confirmedCount'])

  9. fig, ax = plt.subplots(figsize=(15, 8))

  10. colors = dict(zip(
  11.     ['India','Europe','Asia','Latin America','Middle East','North America','Africa'],
  12.     ['#adb0ff', '#ffb3ff', '#90d595', '#e48381', '#aafbff', '#f7bb5f', '#eafb50']
  13. ))
  14. group_lk = df.set_index('provinceName')['provinceShortName'].to_dict()
  15. def draw_barchart(current_day):
  16.     dff = df[df['dateId'].eq(current_day)].sort_values(by='confirmedCount', ascending=True).tail(10)
  17.     ax.clear()
  18.     #ax.barh(dff['provinceName'], dff['confirmedCount'], color=[colors[group_lk[x]] for x in dff['provinceName']])
  19.     ax.barh(dff['provinceShortName'],dff['confirmedCount'],color = [get_colordict()[x] for x in dff['provinceShortName']])
  20.     dx = dff['confirmedCount'].max() / 200
  21.     for i, (value, name) in enumerate(zip(dff['confirmedCount'], dff['provinceName'])):
  22.         ax.text(value-dx, i,     name,           size=14, weight=600, ha='right', va='bottom')
  23.         ax.text(value-dx, i-.25, group_lk[name], size=10, color='#444444', ha='right', va='baseline')
  24.         ax.text(value+dx, i,     f'{value:,.0f}',  size=14, ha='left',  va='center')
  25.     # ... 优化风格
  26.     ax.text(1, 0.4, current_day, transform=ax.transAxes, color='#777777', size=46, ha='right', weight=800)
  27.     ax.text(0, 1.06, 'Population (thousands)', transform=ax.transAxes, size=12, color='#777777')
  28.     ax.xaxis.set_major_formatter(ticker.StrMethodFormatter('{x:,.0f}'))
  29.     ax.xaxis.set_ticks_position('top')
  30.     ax.tick_params(axis='x', colors='#777777', labelsize=12)
  31.     ax.set_yticks([])
  32.     ax.margins(0, 0.01)
  33.     ax.grid(which='major', axis='x', linestyle='-')
  34.     ax.set_axisbelow(True)
  35.     ax.text(0, 1.12, 'The most populous cities in the world from 1500 to 2018',
  36.             transform=ax.transAxes, size=24, weight=600, ha='left')
  37.     ax.text(1, 0, 'by @pratapvardhan; credit @jburnmurdoch', transform=ax.transAxes, ha='right',
  38.             color='#777777', bbox=dict(facecolor='white', alpha=0.8, edgecolor='white'))
  39.     plt.box(False)
  40.    
  41. month_day=[0,31,29,31,30,31,30]
  42. def all_day(start,end):
  43.     days = []
  44.     cur_day = start
  45.     while cur_day < end:
  46.         mon = (cur_day//100) % 100
  47.         if cur_day % 100 == month_day[mon]:
  48.             cur_day = 20200000+(mon+1)*100+1
  49.         else:
  50.             cur_day += 1
  51.         days.append(cur_day)
  52.     return days
  53. days = all_day(20200122,20200608)

  54. def randomcolor():#颜色随机生成
  55.     colorlist = ['1','2','3','4','5','6','7','8','9','A','B','C','D','E','F']
  56.     color =''
  57.     for i in range(6):
  58.         color += random.choice(colorlist)
  59.     return '#'+ color

  60. def get_colordict():
  61.     area_list1 = set(df['provinceShortName'])
  62.     color_list = []
  63.     for i in range(len(area_list1)):
  64.         str_1 = randomcolor()
  65.         color_list.append(str_1)
  66.         str_1 = randomcolor()
  67.     area_list2 = [i for i in area_list1]

  68.     color_dict = dict(zip(area_list2,color_list))
  69.     return color_dict

  70. draw_barchart(20200607)

  71. animator = animation.FuncAnimation(fig, draw_barchart, frames=days)
  72. #HTML(animator.to_jshtml())
  73. plt.show()
复制代码

crowna.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-20 18:12:46 | 显示全部楼层
java2python 发表于 2020-6-20 13:01
你的程序,应该是拷贝Bar Chart Race(条形竞赛图) in Python with Matplotlib
https://zhuanlan.zhihu.c ...

对,就是这个,但是比赛没有ipython库没法动态显示,我想解决的是这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-20 18:34:08 | 显示全部楼层
朱宝恒 发表于 2020-6-20 18:12
对,就是这个,但是比赛没有ipython库没法动态显示,我想解决的是这个问题

我上边的程序没用到这个库啊,可以动态表示的啊,实际只表示条形图,不用matlab,用pygame也可以做到,只不过就是矩形嘛。你原先程序range(20200122,20200608),这个错了,走不动了,不会进入循环了。这个日期的列表需要手动生成。其他应该没问题的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-20 18:50:24 | 显示全部楼层
不太好意思贴,gif文件太大,只能表示几天的,你这个区间有几个月:
test.gif
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-20 21:12:42 From FishC Mobile | 显示全部楼层
巧了,我也才参加省里的比赛,也用的是matplotlib,不过我还打算深入切PyQt开发,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-20 21:48:37 | 显示全部楼层
Traceback (most recent call last):
  File "E:\python\省赛材料\text3.py", line 96, in <module>
    draw_barchart(20200607)
  File "E:\python\省赛材料\text3.py", line 37, in draw_barchart
    ax.text(value - dx, i - .25, group_lk[name], size=10, color='#444444', ha='right', va='baseline')
KeyError: '山东省'
我运行了一下你的代码,为什么山东省会出问题啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-20 22:41:34 | 显示全部楼层
这个我也遇到了,怎么解决的,真的想不起来了,因为程序改的地方太多了:其实不算多,要改的地方A,B,C,D,E
结果A改成A+,B改成B+,C改成C+,如此组合起来,有时自己也晕了。真的想不起来了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-20 23:17:30 | 显示全部楼层
别自己再一定要搞PKL了,泡菜,csv太低端?虽然这里毫无问题,其实没明白为何一定要excel线路,泡菜,怎么麻烦。或许是拿了别人的程序,觉得不加一点不好意思。怎么说呢,一开始应该先做能跑通的,看你好像,调试不咋过关,遇到问题,就求助了。不是说求助不行。而是毕竟这一来一回,哦特慢。。。
先搞一个能跑的,这个是最关键的,然后一步一步加,因为你加了三步,结果又不动了,就搞不清楚是哪一步出问题了。
调试很关键,为啥,毕竟不可能什么都求助,把程序弄成能跑是最基础的。
比如keyerror,可能是group_lk[name],找不到“山东省”的对应数据,实际我因为忘了。你最好能够有调试环境,光标行,用鼠标指上去,看看里面什么值,什么情况,一下子就明白了。
贴了个附件,这个应该是能跑的,如果你不加入自己的那些复杂东西的话。要加也是一步一步加,不是整体工程全搞完,然后一看不行,这有点扯谈。

matlab.zip

53.57 KB, 下载次数: 1

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-21 19:39:53 | 显示全部楼层
谢谢你了,已经调试好了,没传上来,麻烦你了,用泡菜的原因其实是不让用pandas库,我原来用正则都写好了,又看到你的代码,然后我寻思着用二进制保存到本地然后一起上交,没有别的意思
谢谢你的帮助,其实我特别不愿意麻烦你们,我以后会继续努力的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-21 19:41:43 | 显示全部楼层
哦错了,不是你这个,就是我原来拷贝的那个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-22 08:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表