這幾天完成了一個小項目,畫出的圖像總是不理想,很多細節需要調節,譬如橫坐標的控制、圖例的控制、周邊留白的控制還有圖片大小尺寸的控制,都需要根據業務需求來調整。
下面我一步步來說明怎么控制畫圖的參數
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.('文件名')替換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.('/Users///pct1.png', ='tight') 替換 plt.('/Users///pct1.png') 這里的='tight'就有這個功能。 結果是這樣:
4. 加入標題、x軸y軸名稱
這里只需要在畫圖代碼前添加三行代碼:
# 標題
plt.title("title")
# 橫坐標描述
plt.xlabel('date')
# 縱坐標描述
plt.ylabel('num')
5. 圖例
在畫圖后添加一行代碼python 在圖像上畫線,就能顯示圖例。
# 設置數字標簽
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. 橫坐標部分顯示
這個比較復雜,直接看代碼python 在圖像上畫線,這里調用了.(),方法用來控制橫軸顯示的最多的標記數,還可以通過其他方法控制,比如間隔數。 這里麻煩的是要畫子圖才能實現。
# 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 #分辨率