<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          看完這篇文章,我徹底愛上了Python動(dòng)態(tài)圖表!

          共 26071字,需瀏覽 53分鐘

           ·

          2020-12-11 04:15

          作者 | 小F
          來源 |?法納斯特


          關(guān)于動(dòng)態(tài)條形圖,小F以前推薦過「Bar Chart Race」這個(gè)庫(kù)。三行代碼就能實(shí)現(xiàn)動(dòng)態(tài)條形圖的繪制。


          有些同學(xué)在使用的時(shí)候,會(huì)出現(xiàn)一些錯(cuò)誤。一個(gè)是加載文件報(bào)錯(cuò),另一個(gè)是生成GIF的時(shí)候報(bào)錯(cuò)。


          這是因?yàn)樽髡叩氖纠蔷W(wǎng)絡(luò)加載數(shù)據(jù),會(huì)讀取不到。通過讀取本地文件,就不會(huì)出錯(cuò)。


          GIF生成失敗一般是需要安裝imagemagick(圖片處理工具)。


          最近小F又發(fā)現(xiàn)一個(gè)可視化圖庫(kù)「Pandas_Alive」,不僅包含動(dòng)態(tài)條形圖,還可以繪制動(dòng)態(tài)曲線圖、氣泡圖、餅狀圖、地圖等。


          同樣也是幾行代碼就能完成動(dòng)態(tài)圖表的繪制。


          GitHub地址:

          https://github.com/JackMcKew/pandas_alive


          使用文檔:https://jackmckew.github.io/pandas_alive/


          安裝版本建議是0.2.3,matplotlib版本是3.2.1。


          同時(shí)需自行安裝tqdm(顯示進(jìn)度條)和descartes(繪制地圖相關(guān)庫(kù))。


          要不然會(huì)出現(xiàn)報(bào)錯(cuò),估計(jì)是作者的requestment.txt沒包含這兩個(gè)庫(kù)。


          好了,成功安裝后就可以引入這個(gè)第三方庫(kù),直接選擇加載本地文件。


          import?pandas_alive
          import?pandas?as?pd

          covid_df?=?pd.read_csv('data/covid19.csv',?index_col=0,?parse_dates=[0])
          covid_df.plot_animated(filename='examples/example-barh-chart.gif',?n_visible=15)


          生成了一個(gè)GIF圖,具體如下。



          剛開始學(xué)習(xí)這個(gè)庫(kù)的時(shí)候,大家可以減少數(shù)據(jù),這樣生成GIF的時(shí)間就會(huì)快一些


          比如小F在接下來的實(shí)踐中,基本都只選取了20天左右的數(shù)據(jù)。



          對(duì)于其他圖表,我們可以查看官方文檔的API說明,得以了解。



          下面我們就來看看其他動(dòng)態(tài)圖表的繪制方法吧!



          01 動(dòng)態(tài)條形圖


          elec_df?=?pd.read_csv("data/Aus_Elec_Gen_1980_2018.csv",?index_col=0,?parse_dates=[0],?thousands=',')
          elec_df?=?elec_df.iloc[:20,?:]
          elec_df.fillna(0).plot_animated('examples/example-electricity-generated-australia.gif',?period_fmt="%Y",
          ????????????????????????????????title='Australian?Electricity?Generation?Sources?1980-2018')


          02 動(dòng)態(tài)柱狀圖


          covid_df?=?pd.read_csv('data/covid19.csv',?index_col=0,?parse_dates=[0])
          covid_df.plot_animated(filename='examples/example-barv-chart.gif',?orientation='v',?n_visible=15)


          03?動(dòng)態(tài)曲線圖


          covid_df?=?pd.read_csv('data/covid19.csv',?index_col=0,?parse_dates=[0])
          covid_df.diff().fillna(0).plot_animated(filename='examples/example-line-chart.gif',?kind='line',?period_label={'x':?0.25,?'y':?0.9})

          ?

          04 動(dòng)態(tài)面積圖


          covid_df?=?pd.read_csv('data/covid19.csv',?index_col=0,?parse_dates=[0])
          covid_df.sum(axis=1).fillna(0).plot_animated(filename='examples/example-bar-chart.gif',?kind='bar',
          ????????period_label={'x':?0.1,?'y':?0.9},
          ????????enable_progress_bar=True,?steps_per_period=2,?interpolate_period=True,?period_length=200
          )


          05 動(dòng)態(tài)散點(diǎn)圖


          max_temp_df?=?pd.read_csv(
          ????"data/Newcastle_Australia_Max_Temps.csv",
          ????parse_dates={"Timestamp":?["Year",?"Month",?"Day"]},
          )
          min_temp_df?=?pd.read_csv(
          ????"data/Newcastle_Australia_Min_Temps.csv",
          ????parse_dates={"Timestamp":?["Year",?"Month",?"Day"]},
          )

          max_temp_df?=?max_temp_df.iloc[:5000,?:]
          min_temp_df?=?min_temp_df.iloc[:5000,?:]

          merged_temp_df?=?pd.merge_asof(max_temp_df,?min_temp_df,?on="Timestamp")
          merged_temp_df.index?=?pd.to_datetime(merged_temp_df["Timestamp"].dt.strftime('%Y/%m/%d'))

          keep_columns?=?["Minimum?temperature?(Degree?C)",?"Maximum?temperature?(Degree?C)"]
          merged_temp_df[keep_columns].resample("Y").mean().plot_animated(filename='examples/example-scatter-chart.gif',?kind="scatter",
          ????????????????????????????????????????????????????????????????title='Max?&?Min?Temperature?Newcastle,?Australia')


          06 動(dòng)態(tài)餅狀圖


          covid_df?=?pd.read_csv('data/covid19.csv',?index_col=0,?parse_dates=[0])
          covid_df.plot_animated(filename='examples/example-pie-chart.gif',?kind="pie",
          ???????????????????????rotatelabels=True,?period_label={'x':?0,?'y':?0})


          07 動(dòng)態(tài)氣泡圖


          multi_index_df?=?pd.read_csv("data/multi.csv",?header=[0,?1],?index_col=0)
          multi_index_df.index?=?pd.to_datetime(multi_index_df.index,?dayfirst=True)

          map_chart?=?multi_index_df.plot_animated(
          ????kind="bubble",
          ????filename="examples/example-bubble-chart.gif",
          ????x_data_label="Longitude",
          ????y_data_label="Latitude",
          ????size_data_label="Cases",
          ????color_data_label="Cases",
          ????vmax=5,?steps_per_period=3,?interpolate_period=True,?period_length=500,
          ????dpi=100
          )


          08 地理空間點(diǎn)圖表


          import?geopandas
          import?pandas_alive
          import?contextily

          gdf?=?geopandas.read_file('data/nsw-covid19-cases-by-postcode.gpkg')
          gdf.index?=?gdf.postcode
          gdf?=?gdf.drop('postcode',axis=1)

          result?=?gdf.iloc[:,?:20]
          result['geometry']?=?gdf.iloc[:,?-1:]['geometry']

          map_chart?=?result.plot_animated(filename='examples/example-geo-point-chart.gif',
          ?????????????????????????????????basemap_format={'source':contextily.providers.Stamen.Terrain})


          09 多邊形地理圖表


          import?geopandas
          import?pandas_alive
          import?contextily

          gdf?=?geopandas.read_file('data/italy-covid-region.gpkg')
          gdf.index?=?gdf.region
          gdf?=?gdf.drop('region',axis=1)

          result?=?gdf.iloc[:,?:20]
          result['geometry']?=?gdf.iloc[:,?-1:]['geometry']

          map_chart?=?result.plot_animated(filename='examples/example-geo-polygon-chart.gif',
          ?????????????????????????????????basemap_format={'source':?contextily.providers.Stamen.Terrain})


          10 多個(gè)動(dòng)態(tài)圖表


          covid_df?=?pd.read_csv('data/covid19.csv',?index_col=0,?parse_dates=[0])

          animated_line_chart?=?covid_df.diff().fillna(0).plot_animated(kind='line',?period_label=False,add_legend=False)
          animated_bar_chart?=?covid_df.plot_animated(n_visible=10)

          pandas_alive.animate_multiple_plots('examples/example-bar-and-line-chart.gif',
          ????????????????????????????????????[animated_bar_chart,?animated_line_chart],?enable_progress_bar=True)


          11 城市人口


          def?population():
          ????urban_df?=?pd.read_csv("data/urban_pop.csv",?index_col=0,?parse_dates=[0])

          ????animated_line_chart?=?(
          ????????urban_df.sum(axis=1)
          ????????????.pct_change()
          ????????????.fillna(method='bfill')
          ????????????.mul(100)
          ????????????.plot_animated(kind="line",?title="Total?%?Change?in?Population",?period_label=False,?add_legend=False)
          ????)

          ????animated_bar_chart?=?urban_df.plot_animated(n_visible=10,?title='Top?10?Populous?Countries',?period_fmt="%Y")

          ????pandas_alive.animate_multiple_plots('examples/example-bar-and-line-urban-chart.gif',
          ????????????????????????????????????????[animated_bar_chart,?animated_line_chart],
          ????????????????????????????????????????title='Urban?Population?1977?-?2018',?adjust_subplot_top=0.85,
          ????????????????????????????????????????enable_progress_bar=True)


          12 G7國(guó)家平均壽命


          def?life():
          ????data_raw?=?pd.read_csv("data/long.csv")

          ????list_G7?=?[
          ????????"Canada",
          ????????"France",
          ????????"Germany",
          ????????"Italy",
          ????????"Japan",
          ????????"United?Kingdom",
          ????????"United?States",
          ????]

          ????data_raw?=?data_raw.pivot(
          ????????index="Year",?columns="Entity",?values="Life?expectancy?(Gapminder,?UN)"
          ????)

          ????data?=?pd.DataFrame()
          ????data["Year"]?=?data_raw.reset_index()["Year"]
          ????for?country?in?list_G7:
          ????????data[country]?=?data_raw[country].values

          ????data?=?data.fillna(method="pad")
          ????data?=?data.fillna(0)
          ????data?=?data.set_index("Year").loc[1900:].reset_index()

          ????data["Year"]?=?pd.to_datetime(data.reset_index()["Year"].astype(str))

          ????data?=?data.set_index("Year")
          ????data?=?data.iloc[:25,?:]

          ????animated_bar_chart?=?data.plot_animated(
          ????????period_fmt="%Y",?perpendicular_bar_func="mean",?period_length=200,?fixed_max=True
          ????)

          ????animated_line_chart?=?data.plot_animated(
          ????????kind="line",?period_fmt="%Y",?period_length=200,?fixed_max=True
          ????)

          ????pandas_alive.animate_multiple_plots(
          ????????"examples/life-expectancy.gif",
          ????????plots=[animated_bar_chart,?animated_line_chart],
          ????????title="Life?expectancy?in?G7?countries?up?to?2015",
          ????????adjust_subplot_left=0.2,?adjust_subplot_top=0.9,?enable_progress_bar=True
          ????)


          13 新南威爾斯州COVID可視化


          def?nsw():
          ????import?geopandas
          ????import?pandas?as?pd
          ????import?pandas_alive
          ????import?contextily
          ????import?matplotlib.pyplot?as?plt
          ????import?json

          ????with?open('data/package_show.json',?'r',?encoding='utf8')as?fp:
          ????????data?=?json.load(fp)

          ????#?Extract?url?to?csv?component
          ????covid_nsw_data_url?=?data["result"]["resources"][0]["url"]
          ????print(covid_nsw_data_url)

          ????#?Read?csv?from?data?API?url
          ????nsw_covid?=?pd.read_csv('data/confirmed_cases_table1_location.csv')
          ????postcode_dataset?=?pd.read_csv("data/postcode-data.csv")

          ????#?Prepare?data?from?NSW?health?dataset

          ????nsw_covid?=?nsw_covid.fillna(9999)
          ????nsw_covid["postcode"]?=?nsw_covid["postcode"].astype(int)

          ????grouped_df?=?nsw_covid.groupby(["notification_date",?"postcode"]).size()
          ????grouped_df?=?pd.DataFrame(grouped_df).unstack()
          ????grouped_df.columns?=?grouped_df.columns.droplevel().astype(str)

          ????grouped_df?=?grouped_df.fillna(0)
          ????grouped_df.index?=?pd.to_datetime(grouped_df.index)

          ????cases_df?=?grouped_df

          ????#?Clean?data?in?postcode?dataset?prior?to?matching

          ????grouped_df?=?grouped_df.T
          ????postcode_dataset?=?postcode_dataset[postcode_dataset['Longitude'].notna()]
          ????postcode_dataset?=?postcode_dataset[postcode_dataset['Longitude']?!=?0]
          ????postcode_dataset?=?postcode_dataset[postcode_dataset['Latitude'].notna()]
          ????postcode_dataset?=?postcode_dataset[postcode_dataset['Latitude']?!=?0]
          ????postcode_dataset['Postcode']?=?postcode_dataset['Postcode'].astype(str)

          ????#?Build?GeoDataFrame?from?Lat?Long?dataset?and?make?map?chart
          ????grouped_df['Longitude']?=?grouped_df.index.map(postcode_dataset.set_index('Postcode')['Longitude'].to_dict())
          ????grouped_df['Latitude']?=?grouped_df.index.map(postcode_dataset.set_index('Postcode')['Latitude'].to_dict())
          ????gdf?=?geopandas.GeoDataFrame(
          ????????grouped_df,?geometry=geopandas.points_from_xy(grouped_df.Longitude,?grouped_df.Latitude),?crs="EPSG:4326")
          ????gdf?=?gdf.dropna()

          ????#?Prepare?GeoDataFrame?for?writing?to?geopackage
          ????gdf?=?gdf.drop(['Longitude',?'Latitude'],?axis=1)
          ????gdf.columns?=?gdf.columns.astype(str)
          ????gdf['postcode']?=?gdf.index
          ????#?gdf.to_file("data/nsw-covid19-cases-by-postcode.gpkg",?layer='nsw-postcode-covid',?driver="GPKG")

          ????#?Prepare?GeoDataFrame?for?plotting
          ????gdf.index?=?gdf.postcode
          ????gdf?=?gdf.drop('postcode',?axis=1)
          ????gdf?=?gdf.to_crs("EPSG:3857")??#?Web?Mercator

          ????result?=?gdf.iloc[:,?:22]
          ????result['geometry']?=?gdf.iloc[:,?-1:]['geometry']
          ????gdf?=?result

          ????map_chart?=?gdf.plot_animated(basemap_format={'source':?contextily.providers.Stamen.Terrain},?cmap='cool')

          ????#?cases_df.to_csv('data/nsw-covid-cases-by-postcode.csv')
          ????cases_df?=?cases_df.iloc[:22,?:]

          ????from?datetime?import?datetime

          ????bar_chart?=?cases_df.sum(axis=1).plot_animated(
          ????????kind='line',
          ????????label_events={
          ????????????'Ruby?Princess?Disembark':?datetime.strptime("19/03/2020",?"%d/%m/%Y"),
          ????????????#?'Lockdown':?datetime.strptime("31/03/2020",?"%d/%m/%Y")
          ????????},
          ????????fill_under_line_color="blue",
          ????????add_legend=False
          ????)

          ????map_chart.ax.set_title('Cases?by?Location')

          ????grouped_df?=?pd.read_csv('data/nsw-covid-cases-by-postcode.csv',?index_col=0,?parse_dates=[0])
          ????grouped_df?=?grouped_df.iloc[:22,?:]

          ????line_chart?=?(
          ????????grouped_df.sum(axis=1)
          ????????????.cumsum()
          ????????????.fillna(0)
          ????????????.plot_animated(kind="line",?period_label=False,?title="Cumulative?Total?Cases",?add_legend=False)
          ????)

          ????def?current_total(values):
          ????????total?=?values.sum()
          ????????s?=?f'Total?:?{int(total)}'
          ????????return?{'x':?.85,?'y':?.2,?'s':?s,?'ha':?'right',?'size':?11}

          ????race_chart?=?grouped_df.cumsum().plot_animated(
          ????????n_visible=5,?title="Cases?by?Postcode",?period_label=False,?period_summary_func=current_total
          ????)

          ????import?time

          ????timestr?=?time.strftime("%d/%m/%Y")

          ????plots?=?[bar_chart,?line_chart,?map_chart,?race_chart]

          ????from?matplotlib?import?rcParams

          ????rcParams.update({"figure.autolayout":?False})
          ????#?make?sure?figures?are?`Figure()`?instances
          ????figs?=?plt.Figure()
          ????gs?=?figs.add_gridspec(2,?3,?hspace=0.5)
          ????f3_ax1?=?figs.add_subplot(gs[0,?:])
          ????f3_ax1.set_title(bar_chart.title)
          ????bar_chart.ax?=?f3_ax1

          ????f3_ax2?=?figs.add_subplot(gs[1,?0])
          ????f3_ax2.set_title(line_chart.title)
          ????line_chart.ax?=?f3_ax2

          ????f3_ax3?=?figs.add_subplot(gs[1,?1])
          ????f3_ax3.set_title(map_chart.title)
          ????map_chart.ax?=?f3_ax3

          ????f3_ax4?=?figs.add_subplot(gs[1,?2])
          ????f3_ax4.set_title(race_chart.title)
          ????race_chart.ax?=?f3_ax4

          ????timestr?=?cases_df.index.max().strftime("%d/%m/%Y")
          ????figs.suptitle(f"NSW?COVID-19?Confirmed?Cases?up?to?{timestr}")

          ????pandas_alive.animate_multiple_plots(
          ????????'examples/nsw-covid.gif',
          ????????plots,
          ????????figs,
          ????????enable_progress_bar=True
          ????)


          14 意大利COVID可視化


          def?italy():
          ????import?geopandas
          ????import?pandas?as?pd
          ????import?pandas_alive
          ????import?contextily
          ????import?matplotlib.pyplot?as?plt

          ????region_gdf?=?geopandas.read_file('data/geo-data/italy-with-regions')
          ????region_gdf.NOME_REG?=?region_gdf.NOME_REG.str.lower().str.title()
          ????region_gdf?=?region_gdf.replace('Trentino-Alto?Adige/Sudtirol',?'Trentino-Alto?Adige')
          ????region_gdf?=?region_gdf.replace("Valle?D'Aosta/Vall??e?D'Aoste\r\nValle?D'Aosta/Vall??e?D'Aoste",?"Valle?d'Aosta")

          ????italy_df?=?pd.read_csv('data/Regional?Data?-?Sheet1.csv',?index_col=0,?header=1,?parse_dates=[0])

          ????italy_df?=?italy_df[italy_df['Region']?!=?'NA']

          ????cases_df?=?italy_df.iloc[:,?:3]
          ????cases_df['Date']?=?cases_df.index
          ????pivoted?=?cases_df.pivot(values='New?positives',?index='Date',?columns='Region')
          ????pivoted.columns?=?pivoted.columns.astype(str)
          ????pivoted?=?pivoted.rename(columns={'nan':?'Unknown?Region'})

          ????cases_gdf?=?pivoted.T
          ????cases_gdf['geometry']?=?cases_gdf.index.map(region_gdf.set_index('NOME_REG')['geometry'].to_dict())

          ????cases_gdf?=?cases_gdf[cases_gdf['geometry'].notna()]

          ????cases_gdf?=?geopandas.GeoDataFrame(cases_gdf,?crs=region_gdf.crs,?geometry=cases_gdf.geometry)

          ????gdf?=?cases_gdf

          ????result?=?gdf.iloc[:,?:22]
          ????result['geometry']?=?gdf.iloc[:,?-1:]['geometry']
          ????gdf?=?result

          ????map_chart?=?gdf.plot_animated(basemap_format={'source':?contextily.providers.Stamen.Terrain},?cmap='viridis')

          ????cases_df?=?pivoted
          ????cases_df?=?cases_df.iloc[:22,?:]

          ????from?datetime?import?datetime

          ????bar_chart?=?cases_df.sum(axis=1).plot_animated(
          ????????kind='line',
          ????????label_events={
          ????????????'Schools?Close':?datetime.strptime("4/03/2020",?"%d/%m/%Y"),
          ????????????'Phase?I?Lockdown':?datetime.strptime("11/03/2020",?"%d/%m/%Y"),
          ????????????#?'1M?Global?Cases':?datetime.strptime("02/04/2020",?"%d/%m/%Y"),
          ????????????#?'100k?Global?Deaths':?datetime.strptime("10/04/2020",?"%d/%m/%Y"),
          ????????????#?'Manufacturing?Reopens':?datetime.strptime("26/04/2020",?"%d/%m/%Y"),
          ????????????#?'Phase?II?Lockdown':?datetime.strptime("4/05/2020",?"%d/%m/%Y"),
          ????????},
          ????????fill_under_line_color="blue",
          ????????add_legend=False
          ????)

          ????map_chart.ax.set_title('Cases?by?Location')

          ????line_chart?=?(
          ????????cases_df.sum(axis=1)
          ????????????.cumsum()
          ????????????.fillna(0)
          ????????????.plot_animated(kind="line",?period_label=False,?title="Cumulative?Total?Cases",?add_legend=False)
          ????)

          ????def?current_total(values):
          ????????total?=?values.sum()
          ????????s?=?f'Total?:?{int(total)}'
          ????????return?{'x':?.85,?'y':?.1,?'s':?s,?'ha':?'right',?'size':?11}

          ????race_chart?=?cases_df.cumsum().plot_animated(
          ????????n_visible=5,?title="Cases?by?Region",?period_label=False,?period_summary_func=current_total
          ????)

          ????import?time

          ????timestr?=?time.strftime("%d/%m/%Y")

          ????plots?=?[bar_chart,?race_chart,?map_chart,?line_chart]

          ????#?Otherwise?titles?overlap?and?adjust_subplot?does?nothing
          ????from?matplotlib?import?rcParams
          ????from?matplotlib.animation?import?FuncAnimation

          ????rcParams.update({"figure.autolayout":?False})
          ????#?make?sure?figures?are?`Figure()`?instances
          ????figs?=?plt.Figure()
          ????gs?=?figs.add_gridspec(2,?3,?hspace=0.5)
          ????f3_ax1?=?figs.add_subplot(gs[0,?:])
          ????f3_ax1.set_title(bar_chart.title)
          ????bar_chart.ax?=?f3_ax1

          ????f3_ax2?=?figs.add_subplot(gs[1,?0])
          ????f3_ax2.set_title(race_chart.title)
          ????race_chart.ax?=?f3_ax2

          ????f3_ax3?=?figs.add_subplot(gs[1,?1])
          ????f3_ax3.set_title(map_chart.title)
          ????map_chart.ax?=?f3_ax3

          ????f3_ax4?=?figs.add_subplot(gs[1,?2])
          ????f3_ax4.set_title(line_chart.title)
          ????line_chart.ax?=?f3_ax4

          ????axes?=?[f3_ax1,?f3_ax2,?f3_ax3,?f3_ax4]
          ????timestr?=?cases_df.index.max().strftime("%d/%m/%Y")
          ????figs.suptitle(f"Italy?COVID-19?Confirmed?Cases?up?to?{timestr}")

          ????pandas_alive.animate_multiple_plots(
          ????????'examples/italy-covid.gif',
          ????????plots,
          ????????figs,
          ????????enable_progress_bar=True
          ????)


          15 單擺運(yùn)動(dòng)


          def?simple():
          ????import?pandas?as?pd
          ????import?matplotlib.pyplot?as?plt
          ????import?pandas_alive
          ????import?numpy?as?np

          ????#?Physical?constants
          ????g?=?9.81
          ????L?=?.4
          ????mu?=?0.2

          ????THETA_0?=?np.pi?*?70?/?180??#?init?angle?=?70degs
          ????THETA_DOT_0?=?0??#?no?init?angVel
          ????DELTA_T?=?0.01??#?time?stepping
          ????T?=?1.5??#?time?period

          ????#?Definition?of?ODE?(ordinary?differential?equation)
          ????def?get_theta_double_dot(theta,?theta_dot):
          ????????return?-mu?*?theta_dot?-?(g?/?L)?*?np.sin(theta)

          ????#?Solution?to?the?differential?equation
          ????def?pendulum(t):
          ????????#?initialise?changing?values
          ????????theta?=?THETA_0
          ????????theta_dot?=?THETA_DOT_0
          ????????delta_t?=?DELTA_T
          ????????ang?=?[]
          ????????ang_vel?=?[]
          ????????ang_acc?=?[]
          ????????times?=?[]
          ????????for?time?in?np.arange(0,?t,?delta_t):
          ????????????theta_double_dot?=?get_theta_double_dot(
          ????????????????theta,?theta_dot
          ????????????)
          ????????????theta?+=?theta_dot?*?delta_t
          ????????????theta_dot?+=?theta_double_dot?*?delta_t
          ????????????times.append(time)
          ????????????ang.append(theta)
          ????????????ang_vel.append(theta_dot)
          ????????????ang_acc.append(theta_double_dot)
          ????????data?=?np.array([ang,?ang_vel,?ang_acc])
          ????????return?pd.DataFrame(data=data.T,?index=np.array(times),?columns=["angle",?"ang_vel",?"ang_acc"])

          ????#?units?used?for?ref:?["angle?[rad]",?"ang_vel?[rad/s]",?"ang_acc?[rad/s^2]"]
          ????df?=?pendulum(T)
          ????df.index.names?=?["Time?(s)"]
          ????print(df)

          ????#?generate?dataFrame?for?animated?bubble?plot
          ????df2?=?pd.DataFrame(index=df.index)
          ????df2["dx?(m)"]?=?L?*?np.sin(df["angle"])
          ????df2["dy?(m)"]?=?-L?*?np.cos(df["angle"])
          ????df2["ang_vel"]?=?abs(df["ang_vel"])
          ????df2["size"]?=?df2["ang_vel"]?*?100??#?scale?angular?vels?to?get?nice?size?on?bubble?plot
          ????print(df2)

          ????#?static?pandas?plots
          ????#
          ????#?print(plt.style.available)
          ????#?NOTE:?2?lines?below?required?in?Jupyter?to?switch?styles?correctly
          ????plt.rcParams.update(plt.rcParamsDefault)
          ????plt.style.use("ggplot")??#?set?plot?style

          ????fig,?(ax1a,?ax2b)?=?plt.subplots(1,?2,?figsize=(8,?4),?dpi=100)??#?1?row,?2?subplots
          ????#?fig.subplots_adjust(wspace=0.1)??????#?space?subplots?in?row
          ????fig.set_tight_layout(True)
          ????fontsize?=?"small"

          ????df.plot(ax=ax1a).legend(fontsize=fontsize)
          ????ax1a.set_title("Outputs?vs?Time",?fontsize="medium")
          ????ax1a.set_xlabel('Time?[s]',?fontsize=fontsize)
          ????ax1a.set_ylabel('Amplitudes',?fontsize=fontsize);

          ????df.plot(ax=ax2b,?x="angle",?y=["ang_vel",?"ang_acc"]).legend(fontsize=fontsize)
          ????ax2b.set_title("Outputs?vs?Angle?|?Phase-Space",?fontsize="medium")
          ????ax2b.set_xlabel('Angle?[rad]',?fontsize=fontsize)
          ????ax2b.set_ylabel('Angular?Velocity?/?Acc',?fontsize=fontsize)

          ????#?sample?scatter?plot?with?colorbar
          ????fig,?ax?=?plt.subplots()
          ????sc?=?ax.scatter(df2["dx?(m)"],?df2["dy?(m)"],?s=df2["size"]?*?.1,?c=df2["ang_vel"],?cmap="jet")
          ????cbar?=?fig.colorbar(sc)
          ????cbar.set_label(label="ang_vel?[rad/s]",?fontsize="small")
          ????#?sc.set_clim(350,?400)
          ????ax.tick_params(labelrotation=0,?labelsize="medium")
          ????ax_scale?=?1.
          ????ax.set_xlim(-L?*?ax_scale,?L?*?ax_scale)
          ????ax.set_ylim(-L?*?ax_scale?-?0.1,?L?*?ax_scale?-?0.1)
          ????#?make?axes?square:?a?circle?shows?as?a?circle
          ????ax.set_aspect(1?/?ax.get_data_ratio())
          ????ax.arrow(0,?0,?df2["dx?(m)"].iloc[-1],?df2["dy?(m)"].iloc[-1],
          ?????????????color="dimgray",?ls=":",?lw=2.5,?width=.0,?head_width=0,?zorder=-1
          ?????????????)
          ????ax.text(0,?0.15,?s="size?and?colour?of?pendulum?bob\nbased?on?pd?column\nfor?angular?velocity",
          ????????????ha='center',?va='center')

          ????#?plt.show()

          ????dpi?=?100
          ????ax_scale?=?1.1
          ????figsize?=?(3,?3)
          ????fontsize?=?"small"

          ????#?set?up?figure?to?pass?onto?`pandas_alive`
          ????#?NOTE:?by?using?Figure?(capital?F)?instead?of?figure()?`FuncAnimation`?seems?to?run?twice?as?fast!
          ????#?fig1,?ax1?=?plt.subplots()
          ????fig1?=?plt.Figure()
          ????ax1?=?fig1.add_subplot()
          ????fig1.set_size_inches(figsize)
          ????ax1.set_title("Simple?pendulum?animation,?L="?+?str(L)?+?"m",?fontsize="medium")
          ????ax1.set_xlabel("Time?(s)",?color='dimgray',?fontsize=fontsize)
          ????ax1.set_ylabel("Amplitudes",?color='dimgray',?fontsize=fontsize)
          ????ax1.tick_params(labelsize=fontsize)

          ????#?pandas_alive
          ????line_chart?=?df.plot_animated(filename="pend-line.gif",?kind='line',?period_label={'x':?0.05,?'y':?0.9},
          ??????????????????????????????????steps_per_period=1,?interpolate_period=False,?period_length=50,
          ??????????????????????????????????period_fmt='Time:{x:10.2f}',
          ??????????????????????????????????enable_progress_bar=True,?fixed_max=True,?dpi=100,?fig=fig1
          ??????????????????????????????????)
          ????plt.close()

          ????#?Video('examples/pend-line.mp4',?html_attributes="controls?muted?autoplay")

          ????#?set?up?and?generate?animated?scatter?plot
          ????#

          ????#?set?up?figure?to?pass?onto?`pandas_alive`
          ????#?NOTE:?by?using?Figure?(capital?F)?instead?of?figure()?`FuncAnimation`?seems?to?run?twice?as?fast!
          ????fig1sc?=?plt.Figure()
          ????ax1sc?=?fig1sc.add_subplot()
          ????fig1sc.set_size_inches(figsize)
          ????ax1sc.set_title("Simple?pendulum?animation,?L="?+?str(L)?+?"m",?fontsize="medium")
          ????ax1sc.set_xlabel("Time?(s)",?color='dimgray',?fontsize=fontsize)
          ????ax1sc.set_ylabel("Amplitudes",?color='dimgray',?fontsize=fontsize)
          ????ax1sc.tick_params(labelsize=fontsize)

          ????#?pandas_alive
          ????scatter_chart?=?df.plot_animated(filename="pend-scatter.gif",?kind='scatter',?period_label={'x':?0.05,?'y':?0.9},
          ?????????????????????????????????????steps_per_period=1,?interpolate_period=False,?period_length=50,
          ?????????????????????????????????????period_fmt='Time:{x:10.2f}',
          ?????????????????????????????????????enable_progress_bar=True,?fixed_max=True,?dpi=100,?fig=fig1sc,?size="ang_vel"
          ?????????????????????????????????????)
          ????plt.close()

          ????print("Points?size?follows?one?of?the?pd?columns:?ang_vel")
          ????#?Video('./pend-scatter.gif',?html_attributes="controls?muted?autoplay")

          ????#?set?up?and?generate?animated?bar?race?chart
          ????#
          ????#?set?up?figure?to?pass?onto?`pandas_alive`
          ????#?NOTE:?by?using?Figure?(capital?F)?instead?of?figure()?`FuncAnimation`?seems?to?run?twice?as?fast!
          ????fig2?=?plt.Figure()
          ????ax2?=?fig2.add_subplot()
          ????fig2.set_size_inches(figsize)
          ????ax2.set_title("Simple?pendulum?animation,?L="?+?str(L)?+?"m",?fontsize="medium")
          ????ax2.set_xlabel("Amplitudes",?color='dimgray',?fontsize=fontsize)
          ????ax2.set_ylabel("",?color='dimgray',?fontsize="x-small")
          ????ax2.tick_params(labelsize=fontsize)

          ????#?pandas_alive
          ????race_chart?=?df.plot_animated(filename="pend-race.gif",?kind='race',?period_label={'x':?0.05,?'y':?0.9},
          ??????????????????????????????????steps_per_period=1,?interpolate_period=False,?period_length=50,
          ??????????????????????????????????period_fmt='Time:{x:10.2f}',
          ??????????????????????????????????enable_progress_bar=True,?fixed_max=False,?dpi=100,?fig=fig2
          ??????????????????????????????????)
          ????plt.close()

          ????#?set?up?and?generate?bubble?animated?plot
          ????#

          ????#?set?up?figure?to?pass?onto?`pandas_alive`
          ????#?NOTE:?by?using?Figure?(capital?F)?instead?of?figure()?`FuncAnimation`?seems?to?run?twice?as?fast!
          ????fig3?=?plt.Figure()
          ????ax3?=?fig3.add_subplot()
          ????fig3.set_size_inches(figsize)
          ????ax3.set_title("Simple?pendulum?animation,?L="?+?str(L)?+?"m",?fontsize="medium")
          ????ax3.set_xlabel("Hor?Displacement?(m)",?color='dimgray',?fontsize=fontsize)
          ????ax3.set_ylabel("Ver?Displacement?(m)",?color='dimgray',?fontsize=fontsize)
          ????#?limits?&?ratio?below?get?the?graph?square
          ????ax3.set_xlim(-L?*?ax_scale,?L?*?ax_scale)
          ????ax3.set_ylim(-L?*?ax_scale?-?0.1,?L?*?ax_scale?-?0.1)
          ????ratio?=?1.??#?this?is?visual?ratio?of?axes
          ????ax3.set_aspect(ratio?/?ax3.get_data_ratio())

          ????ax3.arrow(0,?0,?df2["dx?(m)"].iloc[-1],?df2["dy?(m)"].iloc[-1],
          ??????????????color="dimgray",?ls=":",?lw=1,?width=.0,?head_width=0,?zorder=-1)

          ????#?pandas_alive
          ????bubble_chart?=?df2.plot_animated(
          ????????kind="bubble",?filename="pend-bubble.gif",
          ????????x_data_label="dx?(m)",?y_data_label="dy?(m)",
          ????????size_data_label="size",?color_data_label="ang_vel",?cmap="jet",
          ????????period_label={'x':?0.05,?'y':?0.9},?vmin=None,?vmax=None,
          ????????steps_per_period=1,?interpolate_period=False,?period_length=50,?period_fmt='Time:{x:10.2f}s',
          ????????enable_progress_bar=True,?fixed_max=False,?dpi=dpi,?fig=fig3
          ????)
          ????plt.close()

          ????print("Bubble?size?&?colour?animates?with?pd?data?column?for?ang_vel.")

          ????#?Combined?plots
          ????#
          ????fontsize?=?"x-small"
          ????#?Otherwise?titles?overlap?and?subplots_adjust?does?nothing
          ????from?matplotlib?import?rcParams
          ????rcParams.update({"figure.autolayout":?False})

          ????figs?=?plt.Figure(figsize=(9,?4),?dpi=100)
          ????figs.subplots_adjust(wspace=0.1)
          ????gs?=?figs.add_gridspec(2,?2)

          ????ax1?=?figs.add_subplot(gs[0,?0])
          ????ax1.set_xlabel("Time(s)",?color='dimgray',?fontsize=fontsize)
          ????ax1.set_ylabel("Amplitudes",?color='dimgray',?fontsize=fontsize)
          ????ax1.tick_params(labelsize=fontsize)

          ????ax2?=?figs.add_subplot(gs[1,?0])
          ????ax2.set_xlabel("Amplitudes",?color='dimgray',?fontsize=fontsize)
          ????ax2.set_ylabel("",?color='dimgray',?fontsize=fontsize)
          ????ax2.tick_params(labelsize=fontsize)

          ????ax3?=?figs.add_subplot(gs[:,?1])
          ????ax3.set_xlabel("Hor?Displacement?(m)",?color='dimgray',?fontsize=fontsize)
          ????ax3.set_ylabel("Ver?Displacement?(m)",?color='dimgray',?fontsize=fontsize)
          ????ax3.tick_params(labelsize=fontsize)
          ????#?limits?&?ratio?below?get?the?graph?square
          ????ax3.set_xlim(-L?*?ax_scale,?L?*?ax_scale)
          ????ax3.set_ylim(-L?*?ax_scale?-?0.1,?L?*?ax_scale?-?0.1)
          ????ratio?=?1.??#?this?is?visual?ratio?of?axes
          ????ax3.set_aspect(ratio?/?ax3.get_data_ratio())

          ????line_chart.ax?=?ax1
          ????race_chart.ax?=?ax2
          ????bubble_chart.ax?=?ax3

          ????plots?=?[line_chart,?race_chart,?bubble_chart]
          ????#?pandas_alive?combined?using?custom?figure
          ????pandas_alive.animate_multiple_plots(
          ????????filename='pend-combined.gif',?plots=plots,?custom_fig=figs,?dpi=100,?enable_progress_bar=True,
          ????????adjust_subplot_left=0.2,?adjust_subplot_right=None,
          ????????title="Simple?pendulum?animations,?L="?+?str(L)?+?"m",?title_fontsize="medium"
          ????)
          ????plt.close()


          最后如果你想完成中文動(dòng)態(tài)圖表的制作,加入中文顯示代碼即可。


          #?中文顯示
          plt.rcParams['font.sans-serif']?=?['SimHei']??#?Windows
          plt.rcParams['font.sans-serif']?=?['Hiragino?Sans?GB']?#?Mac
          plt.rcParams['axes.unicode_minus']?=?False

          #?讀取數(shù)據(jù)
          df_result?=?pd.read_csv('data/yuhuanshui.csv',?index_col=0,?parse_dates=[0])
          #?生成圖表
          animated_line_chart?=?df_result.diff().fillna(0).plot_animated(kind='line',?period_label=False,?add_legend=False)
          animated_bar_chart?=?df_result.plot_animated(n_visible=10)
          pandas_alive.animate_multiple_plots('examples/yuhuanshui.gif',
          ????????????????????????????????????[animated_bar_chart,?animated_line_chart],?enable_progress_bar=True,
          ????????????????????????????????????title='我是余歡水演職人員熱度排行')


          還是使用演員的百度指數(shù)數(shù)據(jù)。



          CSV文件及相關(guān)代碼鏈接:https://pan.baidu.com/s/1ugxtHNF7wpvZB2meKXhQpQ? 密碼:r8qx


          瀏覽 35
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚欧自拍| 亚洲性爱电影在线 | 国产熟妇 码视频户外直播 | 俺去俺来也在线WWW色官方 | 午夜福利三级 |