python數據可視化之如何用matplotlib畫出漂亮美觀的趨勢圖 | 圖例、座標、日期處理、像素、畫布大小、分辨率、點標籤等問題

這幾天完成了一個小項目,matplotlib畫出的圖像總是不理想,很多細節需要調節,譬如橫座標的控制、圖例的控制、周邊留白的控制還有圖片大小尺寸的控制,都需要根據業務需求來調整。

這裏寫圖片描述


下面我一步步來說明怎麼控制畫圖的參數

1. 最基本的畫圖

首先先來一個畫圖的小demo,看看10天的變化趨勢圖

# coding:utf-8
import matplotlib.pyplot as plt

x = [u'2018-07-01', u'2018-07-02', u'2017-07-03', u'2017-07-04', u'2017-07-05'
     , u'2018-07-06', u'2018-07-07', u'2017-07-08', u'2017-07-09', u'2017-07-10']
y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
plt.plot(x, y, label='yy', linewidth=1, color='orange', marker='o', markerfacecolor='red', markersize=1)
plt.show()

結果是這樣:
這裏寫圖片描述


#####2.畫圖保存
大多數時候我們需要的不僅僅是把圖片畫出來,還要保存到本地,這時候需要改一個地方,把上面的代碼最後一行換了,用plt.savefig('文件名')替換plt.show()

# coding:utf-8
import matplotlib.pyplot as plt

x = [u'2018-07-01', u'2018-07-02', u'2017-07-03', u'2017-07-04', u'2017-07-05'
     , u'2018-07-06', u'2018-07-07', u'2017-07-08', u'2017-07-09', u'2017-07-10']
y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
# 這裏設置線寬、線型、線條顏色、點大小等參數
plt.plot(x, y, label='yy', linewidth=1, color='orange', marker='o', markerfacecolor='red', markersize=1)
plt.savefig('/Users/taorui02/Desktop/pct1.png')

結果是這樣
這裏寫圖片描述

3.去掉圖片周邊的留白

在使用圖片的時候圖像周邊太多空白會浪費很多空間,這時候只需要在上面代碼最後一行代碼加一點信息,
plt.savefig('/Users/taorui02/Desktop/pct1.png', bbox_inches='tight')
替換
plt.savefig('/Users/taorui02/Desktop/pct1.png')
這裏的bbox_inches='tight'就有這個功能。
結果是這樣:
這裏寫圖片描述

4. 加入標題、x軸y軸名稱

這裏只需要在畫圖代碼前添加三行代碼:

# 標題
plt.title("title")
# 橫座標描述
plt.xlabel('date')
# 縱座標描述
plt.ylabel('num')

5. 圖例

在畫圖後添加一行代碼,就能顯示圖例。

# 設置數字標籤
plt.legend(loc='upper left')

loc設置圖例的位置,圖例信息在執行plot的時候設置的。

6. 畫布大小

添加一行代碼來設置

# 設置畫布大小
plt.figure(figsize=(20, 4))

顯示結果:
這裏寫圖片描述
畫了一個比較寬的圖,解決了橫座標相互遮擋的問題

7. 給座標點加標註

加兩行代碼:

# 每個數據點加標籤
for a, b in zip(x, y):
    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)   

結果:
這裏寫圖片描述
如果只需要給一個點加標註:

# 只給最後一個點加標籤
plt.text(x[-1], y[-1], y[-1], ha='center', va='bottom', fontsize=10)

結果:
這裏寫圖片描述

8. 橫座標部分顯示

這個比較複雜,直接看代碼,這裏調用了ticker.MaxNLocator(tick_spacing)MaxNLocato方法用來控制橫軸顯示的最多的標記數,還可以通過其他方法控制,比如間隔數。
這裏麻煩的是要畫子圖才能實現。

# coding:utf-8
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = ['2018-07-01', '2018-07-02', '2017-07-03', '2017-07-04', '2017-07-05'
     , '2018-07-06', '2018-07-07', '2017-07-08', '2017-07-09', '2017-07-10']
y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]

# 設置畫布大小
plt.figure(figsize=(20, 4))
# 標題
plt.title("title")
# 橫座標描述
plt.xlabel('date')
# 縱座標描述
plt.ylabel('num')

tick_spacing = 3
fig, ax = plt.subplots(1, 1)
ax.xaxis.set_major_locator(ticker.MaxNLocator(tick_spacing))

# 這裏設置線寬、線型、線條顏色、點大小等參數
ax.plot(x, y, label='yy', linewidth=1, color='orange', marker='o', markerfacecolor='red', markersize=1)
# 每個數據點加標籤
#for a, b in zip(x, y):
#    plt.text(a, b, b, ha='center', va='bottom', fontsize=10)
# 只給最後一個點加標籤
plt.text(x[-1], y[-1], y[-1], ha='center', va='bottom', fontsize=10)

# 圖例顯示及位置確定
plt.legend(loc='upper left')
plt.savefig('/Users/taorui02/Desktop/pct1.png', bbox_inches='tight')

結果:
這裏寫圖片描述

9.橫軸座標標籤旋轉

添加代碼:

# 旋轉x軸標籤
for label in ax.get_xticklabels():
     label.set_rotation(30)  # 旋轉30度
     label.set_horizontalalignment('right')  # 向右旋轉

結果:
這裏寫圖片描述

10.畫多條線

多線只需要多加一行plot代碼

# coding:utf-8
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker

x = ['2018-07-01', '2018-07-02', '2017-07-03', '2017-07-04', '2017-07-05'
     , '2018-07-06', '2018-07-07', '2017-07-08', '2017-07-09', '2017-07-10']
y = [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
z = [1, 2, 3, 4, 7, 1, 2, 3, 4, 10]
# 設置畫布大小
plt.figure(figsize=(20, 4))

tick_spacing = 4
fig, ax = plt.subplots(1, 1)
ax.xaxis.set_major_locator(ticker.MaxNLocator(tick_spacing))

# 標題
plt.title("title")
# 橫座標描述
plt.xlabel('date')
# 縱座標描述
plt.ylabel('num')

# 這裏設置線寬、線型、線條顏色、點大小等參數
ax.plot(x, y, label='yy', linewidth=2, color='black', marker='o', markerfacecolor='red', markersize=4)
ax.plot(x, z, label='zz', linewidth=2, color='red', marker='o', markerfacecolor='black', markersize=4)
# 每個數據點加標籤
for a, b in zip(x, z):
    plt.text(a, b, str(b)+'%', ha='center', va='bottom', fontsize=12)
# 只給最後一個點加標籤
plt.text(x[-1], y[-1], y[-1], ha='center', va='bottom', fontsize=15)

# 旋轉x軸標籤
for label in ax.get_xticklabels():
     label.set_rotation(30)  # 旋轉30度
     label.set_horizontalalignment('right')  # 向右旋轉

# 圖例顯示及位置確定
plt.legend(loc='upper left')
plt.savefig('/Users/taorui02/Desktop/pct1.png', bbox_inches='tight')

最後結果
這裏寫圖片描述

11.像素、分辨率設置

按默認值畫出的圖會有點虛,這時候就需要設置一下像素和分辨率。

plt.rcParams['savefig.dpi'] = 300 #圖片像素

plt.rcParams['figure.dpi'] = 600 #分辨率
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章