二十二世纪古墓奇兵爱慕影院

小梁建站專注重慶中小企業網站建設SEO優化,讓您網站更具價值!

當前位置:首頁 > WEB前端學習 > 如何利用python繪制動態氣泡圖【實戰作圖詳解】

如何利用python繪制動態氣泡圖【實戰作圖詳解】

時間:2018-08-10 12:07 來源:重慶網站制作公司(www.l2qz.net) 作者:重慶網站建設公司

 
 
今天,梁先國網絡科技網帶大家來嘗試通過python繪制動態氣泡圖,復制粘貼程序,一鍵出圖。

 
 
STEP 1 數據準備
 
按照下圖格式建立待讀取的Excel文件:每一工作表包含一個維度的相應數據,例如,下表展示的為不同省份、年份對應的申請量數據:

STEP 1 數據準備
 
 
不同省份、年份對應的生產總值數據:
不同工作表中,年份或地區的順序可以存在不同,當展示的為地區數據時,是否有“省”、“市”的后綴并不影響程序的讀取。
 
STEP 2 適應性修改一鍵出圖
 
下載ImageMagick軟件(百度網盤鏈接:https://pan.baidu.com/s/1mWZHh-EiTcYKp5RTMJ0CRw,密碼:6fnr),用于幫助我們生成gif動圖,安裝完成后,請記住安裝路徑。
 
程序及相關配置文件鏈接:https://pan.baidu.com/s/1LOo0SYBf5VtXyP4P5k1mSQ ,密碼:aegt。
 
將源程序,配置文件(matplotlibrc),以及需要可視化的數據復制到同一文件夾內,使用spyder打開配置文件,修改最后一行:填寫ImageMagick安裝路徑,并刪注釋井號,
 
 
 
在下文程序說明中第二部分,涉及Excel讀取中,適應性修改待讀取的Excel文件名和工作表名稱(修改方式如作圖詳解 |如何利用Python繪制技術功效圖的方法(實戰作圖詳解))
 
使用“Excute in an external system terminal”的方式運行程序,運行后,程序會自動在當前文件夾下生成以橫縱坐標為名字的gif文件。
 
 動態氣泡圖完成效果圖
 
 
如果需要暫停或者恢復播放動畫,按鍵盤上的空格鍵即可。
 
 
 
程序說明
 
程序共分為五個部分。
 
第一部分,導入所需要的包:
 
# -*- coding: utf-8 -*-
 
importmatplotlib.pyplot asplt
 
importnumpy as np
 
importmatplotlib.animation
 
importmatplotlib.patches asmpatches
 
importpandas as pd
 
importsys
 
 
 
第二部分,讀入excel文件:
 
用戶可根據實際需求修改此處的代碼,以讀取相應的sheet。根據實際需求,可以修改x軸數據,y軸數據,排序依據(即氣泡大小表征的數據),以及顯示多少個地區的標簽。
 
#讀入excel文件,根據實際需求修改文件名稱和sheet名稱
 
x_name='專利有效量'
 
y_name='技術市場成交額(億元)'
 
sorted_by='申請量'
 
areas_to_show=10
 
df=pd.read_excel('分省年度數據GDP_最新.xls',sheetname=sorted_by,index_col='地區')
 
df1=pd.read_excel('分省年度數據GDP_最新.xls',sheetname=y_name,index_col='地區')
 
df2=pd.read_excel('分省年度數據GDP_最新.xls',sheetname=x_name,index_col='地區')
 
 
第三部分,處理輸入數據:
 
在輸入的地區數據中,可能只對排名靠前的幾個地區感興趣,這段代碼涉及對各個地區的申請量進行排序挑選出前10名。輸入的excel中有多個工作表,不能保證每個工作表的排序都是一致的,代碼還涉及自動按照申請量排序后整理各個工作表的數據。
 
#對輸入數據按照指定的維度排序
 
data_temp=[]
 
fori in df.index:
 
   data_temp.append(df.loc[i].sum()) 
 
df_merge=pd.DataFrame(index=df.index,columns=['sum'],data=data_temp)
 
df_joined=df.join(df_merge)
 
df_top10=df_joined.sort_values(by='sum',ascending=False).head(areas_to_show)
 
df_top10=df_top10.drop('sum',1) 
 
drop_list=[]
 
fori in df1.index:
 
   if i[:2] in df_top10.index:
 
        pass
 
   else:
 
        drop_list.append(i)
 
df1_temp=df1.drop(drop_list,0) 
 
index_list=[]
 
fori in df_top10.index:
 
   for j in df1_temp.index:
 
        if j[:2]== i[:2]:
 
            index_list.append(j)
 
        else:
 
            pass
 
df1_temp=df1_temp.ix[index_list,:] 
 
drop_list=[]
 
fori in df2.index:
 
   if i[:2] in df_top10.index:
 
        pass
 
   else:
 
        drop_list.append(i)
 
df2_temp=df2.drop(drop_list,0) 
 
index_list=[]
 
fori in df_top10.index:
 
   for j in df2_temp.index:
 
        if j[:2]== i[:2]:
 
            index_list.append(j)
 
        else:
 
            pass
 
df2_temp=df2_temp.ix[index_list,:]
 
 
 
第四部分,動畫:
 
完成每一幀動畫的更新,具體操作為從數據源中提取下一年的新數據,用新數據更新氣泡大小和位置,同時更新相應的年份文本標簽。
 
#動畫函數   
 
defanimate(i):
 
   globalx,y,ax,s1,scale,t1,df,df1,df2,colors_list,key_flag,index_flag,df2_temp,df1_temp,text_list
 
   if key_flag:
 
        return       
 
   if index_flag==0:
 
        t1.set_text(df.columns[-1])
 
        scale=3*np.sqrt(df[df.columns[-1]])
 
        x=df2[df2.columns[-1]]
 
        y=df1[df1.columns[-1]]
 
        offsets=[]
 
        for a,b in zip(x,y):
 
            offsets.append((a,b))
 
        s1.set_offsets(offsets)
 
        s1.set_sizes(scale*2)
 
        s1.set_color(colors_list)
 
        for i in text_list:
 
           i.set_position((df2_temp.loc[i.get_text()][df2_temp.columns[len(df2_temp.columns)-index_flag-1]],df1_temp.loc[[j for j in df1_temp.index if i.get_text() inj][0]][df1_temp.columns[len(df1_temp.columns)-index_flag-1]])) 
 
        index_flag+=1
 
        return   
 
   scale=3*np.sqrt(df[df.columns[len(df.columns)-index_flag-1]])
 
   x=df2[df2.columns[len(df.columns)-index_flag-1]]
 
   y=df1[df1.columns[len(df.columns)-index_flag-1]]
 
   offsets=[]
 
   for a,b in zip(x,y):
 
        offsets.append((a,b))
 
   s1.set_offsets(offsets)
 
   s1.set_sizes(scale*2)
 
   t1.set_text(df.columns[len(df.columns)-index_flag-1])
 
   for i in text_list:
 
       i.set_position((df2_temp.loc[i.get_text()][df2_temp.columns[len(df2_temp.columns)-index_flag-1]],df1_temp.loc[[j for j in df1_temp.index if i.get_text() inj][0]][df1_temp.columns[len(df1_temp.columns)-index_flag-1]]))
 
   if index_flag < 9:
 
        index_flag+=1
 
   else:
 
       index_flag=0 
 
 
 
第五部分,主體程序:
 
主要完成畫布的初始化,動畫的初始化,以及控制繪圖和保存生成的gif動圖。
 
#主體程序,初始化繪圖,動畫設定,輸出設置等
 
fig=plt.figure(figsize=(12,7))
 
ax=fig.add_subplot(111) 
 
fig.canvas.mpl_connect('key_press_event',press) 
 
scale=3*np.sqrt(df[df.columns[-1]])
 
x=df2[df2.columns[-1]]
 
y=df1[df1.columns[-1]] 
 
colors_list=[] 
 
forindex in df.index:
 
   for i in provinces_four_parts:
 
        for j inprovinces_four_parts[i]:
 
            for k in j:
 
                if index in k:
 
                    colors_list.append(j[k])
 
s1=ax.scatter(x, y, c=colors_list,s=scale*2,
 
               alpha=0.5) 
 
ax.set_ylim(0,1.0*max(df1.max()))
 
ax.set_xlim(0,0.7*max(df2.max()))
 
ax.grid()
 
ax.legend(handles=[mpatches.Patch(color=colors_list[i],alpha=0.5,label=df.index[i]) fori inrange(len(df.index))],bbox_to_anchor=(1.1, 1),borderaxespad=0.)
 
ax.set_title('2007-2016各省市'+x_name+'和'+y_name+'關系',size=20)
 
ax.set_xlabel(x_name,size=20)
 
ax.set_ylabel(y_name,size=20)
 
t1=ax.text(0.05*max(df2.max()),0.85*max(df1.max()),df.columns[-1],size=40)
 
text_list=[]
 
fora,b inzip(df2_temp.index,df1_temp.index):
 
   t2=ax.text(df2_temp.loc[a]['2007年'],df1_temp.loc[b]['2007年'],a,size=15,horizontalalignment='center',verticalalignment='center')
 
   text_list.append(t2)
 
ani =matplotlib.animation.FuncAnimation(fig, animate, init_func=init_animation,frames=10,interval=1000)
 
ani.save(x_name+'VS'+y_name+'.gif', writer='imagemagick',fps=2)
 
plt.show()
 
 

版權聲明:本文:如何利用python繪制動態氣泡圖【實戰作圖詳解】 由重慶網站制作公司(www.l2qz.net)原創內容,如需要轉載請注明原文網址:重慶網站建設公司http://www.l2qz.net/

 
喜歡看,就分享到:

圍觀: 9999次 | 責任編輯:重慶網站建設公司

回到頂部
二十二世纪古墓奇兵爱慕影院 澳洲幸运8开奖助手 bbin电子素材 完美世界手游羽灵捏脸二维码 纽伦堡奥购物 广东快乐10分开奖 国王vs火箭 鬼屋试玩 mg电子娱乐平台游戏 探灵笔记投降是哪个 巴塞罗那机场酒店 法老王的秘密免费试玩 幸运飞艇走势数据分析