Home >> Blog >> 運用Python plot - Python novice gapminder

用 Python 繪圖和編寫程式

matplotlib是 Python 中使用最廣泛的科學繪圖庫

  • 通常使用一個名為matplotlib.pyplot.
  • Jupyter Notebook 默認會內聯渲染繪圖。

    Python
    import matplotlib.pyplot as plt

  • 然後簡單地創建簡單的圖。

    TPython
    time = [0, 1, 2, 3]
    position = [0, 100, 200, 300]

    plt.plot(time, position)
    plt.xlabel('Time (hr)')
    plt.ylabel('Position (km)')

用 Python 繪圖和編寫程式

顯示所有打開的圖

在我們的 Jupyter Notebook 範例中,運行單元應在程式碼正下方生成圖形。該圖還包含在 Notebook 文檔中以供將來給SEO部門的工程人員來查看。但是,其他 Python 環境(例如從終端啟動的交互式 Python 會話或通過命令行執行的 Python 腳本)需要額外的命令來顯示圖形。

指示matplotlib顯示一個圖形:

Python
plt.show()

此命令也可以在筆記本Jupyter Notebook中使用 - 例如,如果多個圖形是由單個單元格創建的,則顯示多個圖形。

直接從Pandas dataframe.

  • 我們還可以繪製Pandas 數據框。
  • 這隱含地使用matplotlib.pyplot.
  • 在繪圖之前,我們將列標題從 a 轉換string為integer數據類型,因為它們表示數值

Python
import pandas as pd

data = pd.read_csv('data/gapminder_gdp_oceania.csv', index_col='country')

# Extract year from last 4 characters of each column name
# The current column names are structured as 'gdpPercap_(year)',
# so we want to keep the (year) part only for clarity when plotting GDP vs. years
# To do this we use strip(), which removes from the string the characters stated in the argument
# This method works on strings, so we call str before strip()

years = data.columns.str.strip('gdpPercap_')

# Convert year values to integers, saving results back to dataframe

data.columns = years.astype(int)

data.loc['Australia'].plot()

用 Python 繪圖和編寫程式

選擇和轉換數據,然後繪製它

  • 默認情況下,DataFrame.plot以行為 X 軸進行繪圖。
  • 我們可以轉置數據以繪製多個系列。

Python
data.T.plot()
plt.ylabel('GDP per capita')

用 Python 繪圖和編寫程式

有多種情節風格可供選擇。

  • 例如,使用更高級的樣式繪製條形圖。

Python
plt.style.use('ggplot')
data.T.plot(kind='bar')
plt.ylabel('GDP per capita')

用 Python 繪圖和編寫程式

也可以通過matplotlib plot直接調用函數來繪製數據。

  • 命令是plt.plot(x, y)
  • 標記的顏色和格式也可以指定為附加的可選參數,例如,b-是藍線,g--是綠色虛線。

從數據框中獲取澳大利亞數據

Python
years = data.columns
gdp_australia = data.loc['Australia']

plt.plot(years, gdp_australia, 'g--')

用 Python 繪圖和編寫程式

可以將多組數據繪製在一起。

Python
# Select two countries' worth of data.
gdp_australia = data.loc['Australia']
gdp_nz = data.loc['New Zealand']

# Plot with differently-colored markers.
plt.plot(years, gdp_australia, 'b-', label='Australia')
plt.plot(years, gdp_nz, 'g-', label='New Zealand')

# Create legend.
plt.legend(loc='upper left')
plt.xlabel('Year')
plt.ylabel('GDP per capita ($)')

添加圖例

通常在同一個圖形上繪製多個數據集時,最好有一個描述數據的圖例。

這可以分matplotlib兩個階段完成:

  • 為圖中的每個數據集提供一個標籤:

    TPython
    plt.plot(years, gdp_australia, label='Australia')
    plt.plot(years, gdp_nz, label='New Zealand')

  • 指示matplotlib創建圖例。

    TPython
    plt.legend()

    默認情況下,matplotlib 將嘗試將圖例放置在合適的位置。如果您想指定一個位置,可以使用loc=參數來完成,例如將圖例放在圖的左上角,指定loc='upper left'

    用 Python 繪圖和編寫程式

  • 繪製與澳大利亞和新西蘭的 GDP 相關的散點圖
  • 使用plt.scatter或DataFrame.plot.scatter

TPython
plt.scatter(gdp_australia, gdp_nz)

用 Python 繪圖和編寫程式

Python
data.T.plot.scatter(x = 'Australia', y = 'New Zealand')

用 Python 繪圖和編寫程式

最小值和最大值

填寫下面的空白,繪製歐洲所有國家隨時間變化的最低人均 GDP。再次修改它以繪製歐洲隨時間變化的最大人均 GDP。

Python
data_europe = pd.read_csv('data/gapminder_gdp_europe.csv', index_col='country')
data_europe.____.plot(label='min')
data_europe.____
plt.legend(loc='best')
plt.xticks(rotation=90)

相關性

修改註釋中的範例,創建一個散點圖,顯示數據集中每年亞洲國家人均 GDP 的最小值和最大值之間的關係。你看到了什麼關係(如果有的話)?

您可能會注意到最大值的變異性遠高於最小值的變異性。看一下最大和最大索引:

TPython
data_asia = pd.read_csv('data/gapminder_gdp_asia.csv', index_col='country')
data_asia.max().plot()
print(data_asia.idxmax())
print(data_asia.idxmin())

更多相關性

這個簡短的程序創建了一個圖表,顯示 2007 年 GDP 和預期壽命之間的相關性,按人口標準化標記大小:

Python
data_all = pd.read_csv('data/gapminder_all.csv', index_col='country')
data_all.plot(kind='scatter', x='gdpPercap_2007', y='lifeExp_2007',
s=data_all['pop_2007']/1e6)

使用在線幫助和其他資源,解釋每個參數的plot作用。

將繪圖保存到文件

如果您對所看到的圖感到滿意,您可能希望將其保存到文件中,或許將其包含在出版物中。matplotlib.pyplot 模塊中有一個函數可以完成此操作: savefig。調用這個函數,例如

Python
plt.savefig('my_figure.png')

將當前圖形保存到文件my_figure.png中。文件格式將自動從文件擴展名中推斷出來(其他格式為 pdf、ps、eps 和 svg)。

請注意,函數 inplt引用全局圖形變量,並且在圖形顯示到屏幕後(例如,使用plt.show)matplotlib 將使該變量引用新的空圖形。因此,請確保plt.savefig在繪圖顯示到屏幕之前調用,否則您可能會找到一個帶有空繪圖的文件。

使用數據框時,通常會生成數據並將其繪製在一行中,這plt.savefig似乎不是一種可行的方法。將圖形保存到文件的一種可能性是/p>

  • 在局部變量中保存對當前圖形的引用(使用plt.gcf)
  • savefig從該變量調用類方法。

Python
fig = plt.gcf() # get current figure
data.plot(kind='bar')
fig.savefig('my_figure.png')

使您的地塊易於訪問

每當您為論文或demo文稿生成圖表時,您可以做一些事情來確保每個人都能理解您的圖表。

  • 始終確保您的文本足夠大以閱讀。使用 、 、 和 中的參數以及withfontsize來增加坐標軸上數字的文本大小。xlabelylabeltitlelegendtick_paramslabelsize
  • 同樣,您應該使圖形元素易於查看。用於s增加散點圖標記linewidth的大小並增加繪圖線的大小。
  • 使用顏色(僅此而已)來區分不同的繪圖元素將使色盲或碰巧擁有黑白辦公室印表機的任何人都無法閱讀您的繪圖。對於線條,該linestyle參數允許您使用不同類型的線條。對於散點圖,marker可讓您更改點的形狀。如果您不確定您的顏色,您可以使用Coblis或Color Oracle來模擬您的繪圖對於色盲者的外觀。

關鍵點

  • matplotlib是 Python 中使用最廣泛的科學繪圖庫。
  • 直接從 Pandas 數據框中繪製數據。
  • 選擇和轉換數據,然後繪製它。
  • 有多種繪圖樣式可供選擇:有關更多選項,請參閱Python Graph Gallery。
  • 可以將多組數據繪製在一起。