在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用matplotlib和seaborn繪制圖形

zhKF_jqr_AI ? 來源:未知 ? 作者:李倩 ? 2018-09-18 09:07 ? 次閱讀

編者按:其實matplotlib有一個少有人知的功能animation.FuncAnimation,可以接受你編寫的動畫函數(shù)創(chuàng)建動圖。Viviane Kakerbeck通過一個例子展示了這一功能的用法,并介紹了通過增強數(shù)據(jù)和高斯平滑,讓動圖更美觀的技巧。

美國的過量服用***致死數(shù),使用seaborn創(chuàng)建

Python的matplotlib和seaborn是非常好用的繪圖庫。但它們創(chuàng)建的都是靜態(tài)圖像,難以通過動態(tài)、美觀的方式描述數(shù)據(jù)值的變化。如果你的下一次演示或者下一篇博客文章,能用動態(tài)圖形展示數(shù)據(jù)的發(fā)展,該有多好?更妙的是,你可以繼續(xù)使用matplotlib、seaborn或者其他你喜歡用的庫。

我最近為一部關于美國的阿片樣物質危機的紀錄片制作了一些動態(tài)圖形,所以我會在這篇文章中使用相關的數(shù)據(jù)。數(shù)據(jù)來自美國國家藥物濫用研究所和CDC的公開數(shù)據(jù),可以從以下網(wǎng)址下載:https://www.drugabuse.gov/sites/default/files/overdose_data_1999-2015.xls

本文將使用matplotlib和seaborn繪制圖形,同時使用numpy和pandas處理數(shù)據(jù)。matplotlib提供了一些可以用來制作動畫的函數(shù)。閑話少敘,讓我們開始吧,首先,是引入所有依賴。

import numpy as np

import pandas as pd

import seaborn as sns

import matplotlib

import matplotlib.pyplot as plt

import matplotlib.animation as animation

然后我們加載數(shù)據(jù),將其轉換成pandas的DataFrame。我還編寫了一個輔助函數(shù),可以從感興趣的行加載數(shù)據(jù),之后繪圖會用到。

overdoses = pd.read_excel('overdose_data_1999-2015.xls',sheetname='Online',skiprows =6)

def get_data(table,rownum,title):

data = pd.DataFrame(table.loc[rownum][2:]).astype(float)

data.columns = {title}

return data

準備就緒,下面是本文主要部分,如何繪制動畫。

首先,如果你和我一樣,用的是jupyter notebook,那么我建議你使用%matplotlib notebook指令,這樣可以直接在notebook中查看動畫效果,無需等待保存后再查看。

我使用了之前編寫的輔助函數(shù)get_data取得***服用過量數(shù),并將其封裝入一個兩列的pandas DataFrame,一列表示年份,一列表示服用過量數(shù)。

%matplotlib notebook

title = 'Heroin Overdoses'

d = get_data(overdoses,18,title)

x = np.array(d.index)

y = np.array(d['Heroin Overdoses'])

overdose = pd.DataFrame(y,x)

#XN,YN = augment(x,y,10)

#augmented = pd.DataFrame(YN,XN)

overdose.columns = {title}

接著我們初始化一個寫入器(writer),基于ffmpeg記錄20 fps(比特率為1800)。當然,你可以按照需要調整這些參數(shù)。

Writer = animation.writers['ffmpeg']

writer = Writer(fps=20, metadata=dict(artist='Me'), bitrate=1800)

接下來創(chuàng)建一個帶標簽的圖形。別忘了限定x軸和y軸的范圍,以免動畫在顯示數(shù)據(jù)時出現(xiàn)跳躍現(xiàn)象。

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

plt.xlim(1999, 2016)

plt.ylim(np.min(overdose)[0], np.max(overdose)[0])

plt.xlabel('Year',fontsize=20)

plt.ylabel(title,fontsize=20)

plt.title('Heroin Overdoses per Year',fontsize=20)

制作動畫的關鍵是定義一個動畫函數(shù),指定視頻的每一幀發(fā)生了什么。這里i表示動畫幀的索引。你可以選擇在i幀中可見的數(shù)據(jù)范圍。之后我使用seaborn的線圖繪制選定數(shù)據(jù)。最后兩行我調整了一些尺寸,使圖形看起來更美觀。

def animate(i):

data = overdose.iloc[:int(i+1)] # 選定數(shù)據(jù)范圍

p = sns.lineplot(x=data.index, y=data[title], data=data, color="r")

p.tick_params(labelsize=17)

plt.setp(p.lines,linewidth=7)

定義了動畫函數(shù)后,使用matplotlib.animation.FuncAnimation定義動畫應當包含多少幀,也就是說,通過frames參數(shù)定義調用animate(i)的頻率。

ani = matplotlib.animation.FuncAnimation(fig, animate, frames=17, repeat=True)

之后只需調用ani.save()就可以將動畫保存為mp4文件。如果你想在保存之前先看下效果,那么可以使用plt.show()。

ani.save('HeroinOverdosesJumpy.mp4', writer=writer)

好了,讓我們來看下效果。

看起來效果還可以,但是感覺有點抖動。為了緩解抖動的現(xiàn)象,我們可以在已有數(shù)據(jù)中插入一些中間值,平滑一下。為此我們定義以下的數(shù)據(jù)增強函數(shù):

def augment(xold,yold,numsteps):

xnew = []

ynew = []

for i in range(len(xold)-1):

difX = xold[i+1]-xold[i]

stepsX = difX/numsteps

difY = yold[i+1]-yold[i]

stepsY = difY/numsteps

for s in range(numsteps):

xnew = np.append(xnew,xold[i]+s*stepsX)

ynew = np.append(ynew,yold[i]+s*stepsY)

return xnew,ynew

之后我們只需在數(shù)據(jù)上應用這一增強函數(shù),并相應地增加matplotlib.animation.FuncAnimation函數(shù)中的幀數(shù)。這里我調用augment函數(shù)時使用了參數(shù)numsteps=10,也就是說,我將數(shù)據(jù)點增加到160個,相應地,幀數(shù)設置為frames=160。增強數(shù)據(jù)之后,結果看起來平滑了很多,但在數(shù)據(jù)值變動處,曲線仍有一些尖角,看起來不是特別美觀。

為了讓圖像看起來更美觀,我們實現(xiàn)了一個高斯平滑函數(shù):

def smoothListGaussian(listin,strippedXs=False,degree=5):

window=degree*2-1

weight=np.array([1.0]*window)

weightGauss=[]

for i in range(window):

i=i-degree+1

frac=i/float(window)

gauss=1/(np.exp((4*(frac))**2))

weightGauss.append(gauss)

weight=np.array(weightGauss)*weight

smoothed=[0.0]*(len(listin)-window)

for i in range(len(smoothed)): smoothed[i]=sum(np.array(listin[i:i+window])*weight)/sum(weight)

return smoothe

我在這里不會討論高斯平滑的細節(jié),感興趣的讀者可以看這篇文章:https://www.swharden.com/wp/2008-11-17-linear-data-smoothing-in-python/

最后我們略微調整下顏色和風格,就得到了文章開頭的動態(tài)圖形:

sns.set(rc={'axes.facecolor':'lightgrey', 'figure.facecolor':'lightgrey','figure.edgecolor':'black','axes.grid':False})

本文通過一個例子展現(xiàn)了matplotlib動畫函數(shù)的用法。當然,你可以將它用在任何你想要動畫化的圖形上。只需調整animate()函數(shù)中的參數(shù)和圖形類型,便有無限可能。

我希望你喜歡matplotlib的整個功能,并能善加利用。另外,如果你對我之前提到的紀錄片感興趣,可以在YouTube上查看:https://youtu.be/7xrvuSDLHiY

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 圖像
    +關注

    關注

    2

    文章

    1091

    瀏覽量

    40891
  • 可視化
    +關注

    關注

    1

    文章

    1229

    瀏覽量

    21505
  • python
    +關注

    關注

    56

    文章

    4821

    瀏覽量

    85781

原文標題:matplotlib秘技:讓可視化圖形動起來

文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關注!文章轉載請注明出處。

收藏 0人收藏

    評論

    相關推薦

    VC繪制圖形的示例(含源代碼)

    VC繪制圖形的示例(含源代碼) [hide][/hide]
    發(fā)表于 05-10 10:13

    【安富萊】【STemWin教程】第10章 2-D圖形庫之繪制圖形

    `第10章 2-D圖形庫之繪制圖形 本期主要講解2-D圖形庫的圖形繪制,包括繪制多邊形,
    發(fā)表于 03-25 11:21

    第10章 2-D圖形庫之繪制圖形

    轉stemwin教程本期主要講解2-D圖形庫的圖形繪制,包括繪制多邊形,繪制圓,繪制橢圓,
    發(fā)表于 10-12 10:13

    學習Python大數(shù)據(jù)與機器學習必會Matplotlib知識

    ]5、調用plot (x,y) 繪制圖形并顯示6、創(chuàng)建figure對象,在 [0,0,1,1] 和 [0.2,0.5,.4,.4]創(chuàng)建兩個坐標軸7、使用x,y,z數(shù)組創(chuàng)建圖形如下圖所示,注意x,y
    發(fā)表于 07-05 17:57

    C語言繪制圖像梯度圖原理介紹

    *2401、采集原始圖像配置ESP32輸出灰度圖,像素太高無法存儲及處理。320*240= 75K。2、圖像梯度計算參考代碼:C語言繪制圖像梯度圖 原理介紹:圖像的梯度 h...
    發(fā)表于 01-11 06:36

    如何使用emWin的API繪制圖形

    應用程序: 此示例代碼使用 emWin 的 API 繪制圖形, 可以用作按鈕, 更改面板上文字編輯的值 。 BSP 版本:M480系列BSP CMSIS V3.03.001 硬件
    發(fā)表于 08-23 07:37

    M480使用emWin的API繪制圖形

    應用程序: 此示例代碼使用 emWin 的 API 繪制圖形, 可以用作按鈕, 更改面板上文字編輯的值 。 BSP 版本:M480系列BSP CMSIS V3.03.001 硬件
    發(fā)表于 08-30 08:58

    查找和繪制圖片輪廓矩

    《OpenCV3編程入門》書本配套源代碼:查找和繪制圖片輪廓矩
    發(fā)表于 06-06 15:20 ?3次下載

    OpenCV3編程入門-源碼例程全集-查找和繪制圖片輪廓矩

    OpenCV3編程入門-源碼例程全集-查找和繪制圖片輪廓矩
    發(fā)表于 09-17 22:54 ?2次下載

    OpenGL繪制圖形單元的技巧介紹

    OpenGL要求:指定頂點的命令必須包含在glBegin函數(shù)之后,glEnd函數(shù)之前(否則指定的頂點將被忽略)。在調用glBegin函數(shù)時,我們需要傳入一個參數(shù),以告訴OpenGL我們將繪制什么類型的圖元。
    發(fā)表于 05-07 08:31 ?2772次閱讀

    在MAX32650評估板的LCD面板上如何繪制圖形

    在系列視頻的第三部分,學習如何尋址屏幕存儲器,在MAX32650評估板的LCD面板上繪制簡單圖形。在下節(jié)視頻“開始移動”中,學習如何設置運動的對象。
    的頭像 發(fā)表于 10-11 03:34 ?3598次閱讀

    canvas基礎繪制方法介紹

      canvas是ArkUI開發(fā)框架里的畫布組件,常用于自定義繪制圖形。因為其輕量、靈活、高效等優(yōu)點,被廣泛應用于UI界面開發(fā)中。本期,我們將為大家介紹canvas組件的使用。
    的頭像 發(fā)表于 02-12 10:09 ?4343次閱讀
    canvas基礎<b class='flag-5'>繪制</b>方法介紹

    python中matplotlibseaborn介紹

    的使用和分析,而數(shù)據(jù)的整合最好的方式就是使用可視化的方式將數(shù)據(jù)變現(xiàn)出來。 matplotlib和seabornde介紹 在Python中,我們可以使用matplotlib庫和seaborn庫來生成各種圖表。
    的頭像 發(fā)表于 10-07 11:16 ?1169次閱讀
    python中<b class='flag-5'>matplotlib</b>和<b class='flag-5'>seaborn</b>介紹

    鴻蒙開發(fā)接口圖形圖像:【W(wǎng)ebGL】

    WebGL提供圖形繪制的能力,包括對當前繪制圖形的位置、顏色等進行處理。
    的頭像 發(fā)表于 05-30 09:31 ?740次閱讀
    鴻蒙開發(fā)接口<b class='flag-5'>圖形</b>圖像:【W(wǎng)ebGL】

    鴻蒙開發(fā)接口圖形圖像:【W(wǎng)ebGL2】

    WebGL2支持圖形繪制,包括對當前繪制圖形的位置、顏色等進行處理,其中相對WebGL來說對渲染管道和著色語言進行了增強。
    的頭像 發(fā)表于 05-30 15:19 ?673次閱讀
    鴻蒙開發(fā)接口<b class='flag-5'>圖形</b>圖像:【W(wǎng)ebGL2】

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品
    主站蜘蛛池模板: 国产色妞妞在线观看 | 一女被两男吃奶玩乳尖口述 | 日日噜噜夜夜狠狠va视频 | 日本黄免费| 夜夜爱夜夜做 | 亚洲精品老司机综合影院 | 亚洲免费成人网 | 日本黄色美女视频 | bt在线搜索 | 色综合久久中文综合网 | 在线色色视频 | 综合激情六月 | 人操人摸 | 久久综合九色综合网站 | 中文久草 | 天天射综合 | 日本黄色小说视频 | 日本一本一道久久香蕉免费 | 狠狠躁天天躁 | 亚洲 欧美 自拍 卡通 综合 | 韩国三级床戏合集 | 免费一级特黄特色大片在线观看看 | 国产va免费精品观看 | 99久久无色码中文字幕 | 久久久国产精品免费 | 色噜噜狠狠狠色综合久 | 色视频在线观看完整免费版 | 精品午夜久久影视 | 午夜视频黄色 | 亚洲天堂bt | 欧美色图日韩色图 | 99久久国产免费福利 | 快色视频免费 | 西西人体大胆午夜gog0 | 精品在线小视频 | 免费看黄在线观看 | 手机看片1024日韩 | caoporn97人人做人人爱最新 | 深夜影院一级毛片 | 激情婷婷色 | 国产精品xxxav免费视频 |