前言
本文我們主要介紹利用Python中的Matplotlib模塊進(jìn)行幾種柱狀圖的畫法,包括整張圖片只有一種顏色的不分組柱狀圖、整張圖片有好幾種顏色的不分組柱狀圖、整張圖片有好幾種顏色的分組柱狀圖等。
一、所用到的模塊
主要利用Python中的Matplotlib模塊完成該功能。
二、單一顏色的普通不分組柱狀圖
1.示例數(shù)據(jù)如下
表格如下(示例):
語言種類 | 2020年用戶量(人數(shù)) |
---|---|
C | 2000 |
C++ | 3000 |
Python | 3000 |
Java | 5000 |
Java Script | 2000 |
PHP | 1000 |
Ruby | 800 |
現(xiàn)在需要把表格中的數(shù)據(jù)繪制成柱狀圖,從而進(jìn)一步分析各類語言的用戶的使用情況。文章來源:http://www.zghlxwxcb.cn/news/detail-460233.html
2.代碼如下
2.1 代碼如下(示例):
2.1.1 Case1:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 設(shè)置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負(fù)號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 紅橙黃綠青藍(lán)紫
color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
x_loc = np.arange(7)
# 這里顏色設(shè)置成 橙色:"#FF8C00"
ax.bar(x_loc, y, color=color_list[1])
plt.grid(True, ls=':', color='b', alpha=0.3)
plt.xlabel('編程語言類別', fontweight='bold')
plt.ylabel('編程語言用戶量(人數(shù))', fontweight='bold')
plt.title('編程語言用戶量數(shù)據(jù)分析圖', fontweight='bold')
plt.show()
輸出結(jié)果如下:
注意:此時圖片的橫坐標(biāo)的刻度標(biāo)簽沒有按照我們的要求把各個語言的名字顯示出來,并且圖片中沒有網(wǎng)格,不方便我們查看對應(yīng)的縱軸的值。
2.1.2 Case2:
因此,我們對上述代碼優(yōu)化如下:
(1)把橫坐標(biāo)的刻度標(biāo)簽加上去:
ax.set_xticklabels(x_labels)
(2)加上網(wǎng)格:
plt.grid(True, ls=':', color='b', alpha=0.3)
此時完整代碼如下:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 設(shè)置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負(fù)號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 紅橙黃綠青藍(lán)紫
color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
x_loc = np.arange(7)
# 這里顏色設(shè)置成 橙色:"#FF8C00"
ax.bar(x_loc, y, color=color_list[1])
ax.set_xticklabels(x_labels)
plt.grid(True, ls=':', color='b', alpha=0.3)
plt.xlabel('編程語言類別', fontweight='bold')
plt.ylabel('編程語言用戶量(人數(shù))', fontweight='bold')
plt.title('編程語言用戶量數(shù)據(jù)分析圖', fontweight='bold')
plt.show()
輸出結(jié)果如下:
注意:此時坐標(biāo)軸還是沒有按照我們想要的樣子來呈現(xiàn)對應(yīng)的刻度標(biāo)簽,并且會報出如下的錯誤提示:
2.1.3 Case3:
小編經(jīng)過一番debug發(fā)現(xiàn)出現(xiàn)這個報錯的原因是我們在ax.set_xticklabels(x_labels)前面沒有加上ax.set_xticks(x_labels)這句語句。下面我們把這句語句加上去,再試試。此時完整代碼如下:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 設(shè)置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負(fù)號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 紅橙黃綠青藍(lán)紫
color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
x_loc = np.arange(7)
# 這里顏色設(shè)置成 橙色:"#FF8C00"
ax.bar(x_loc, y, color=color_list[1])
ax.set_xticks(x_loc)
ax.set_xticklabels(x_labels)
plt.grid(True, ls=':', color='b', alpha=0.3)
plt.xlabel('編程語言類別', fontweight='bold')
plt.ylabel('編程語言用戶量(人數(shù))', fontweight='bold')
plt.title('編程語言用戶量數(shù)據(jù)分析圖', fontweight='bold')
plt.show()
輸出結(jié)果如下:
三、多種顏色的普通不分組柱狀圖
1.示例數(shù)據(jù)如下
表格如下(示例):
語言種類 | 2020年用戶量(人數(shù)) |
---|---|
C | 2000 |
C++ | 3000 |
Python | 3000 |
Java | 5000 |
Java Script | 2000 |
PHP | 1000 |
Ruby | 800 |
現(xiàn)在需要把表格中的數(shù)據(jù)繪制成柱狀圖,從而進(jìn)一步分析各類語言的用戶的使用情況。
2.代碼如下
2.1 代碼如下(示例):
2.1.1 Case1:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 設(shè)置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負(fù)號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
y = [2000, 3000, 3000, 5000, 2000, 1000, 800]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 紅橙黃綠青藍(lán)紫
color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
x_loc = np.arange(7)
# 這里顏色設(shè)置成 橙色:"#FF8C00"
ax.bar(x_loc, y, color=color_list)
ax.set_xticks(x_loc)
ax.set_xticklabels(x_labels)
plt.grid(True, ls=':', color='b', alpha=0.3)
plt.xlabel('編程語言類別', fontweight='bold')
plt.ylabel('編程語言用戶量(人數(shù))', fontweight='bold')
plt.title('編程語言用戶量數(shù)據(jù)分析圖', fontweight='bold')
plt.show()
輸出結(jié)果如下:
四、多種顏色的普通分組柱狀圖
1.示例數(shù)據(jù)如下
假如增加了2021和2022年每種語言的用戶量情況,數(shù)據(jù)如下表所示(示例):
語言種類 | 2020年用戶量人數(shù) | 2021年用戶量人數(shù) | 2022年用戶量人數(shù) |
---|---|---|---|
C | 2000 | 3000 | 5000 |
C++ | 3000 | 4000 | 6000 |
Python | 3000 | 6000 | 10000 |
Java | 5000 | 4000 | 6000 |
Java Script | 2000 | 4000 | 3000 |
PHP | 1000 | 2000 | 2000 |
Ruby | 800 | 1000 | 1000 |
現(xiàn)在需要把表格中的數(shù)據(jù)繪制成柱狀圖,從而進(jìn)一步分析各類語言的用戶的使用情況。
2.代碼如下
2.1 代碼如下(示例):
2.1.1 Case1:
- 代碼如下:
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
# 設(shè)置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負(fù)號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
x_labels = ['C', 'C++', 'Python', 'Java', 'Java Script', 'PHP', 'Ruby']
y_2020 = [2000, 3000, 3000, 5000, 2000, 1000, 800]
y_2021 = [3000, 4000, 6000, 4000, 4000, 2000, 1000]
y_2022 = [5000, 6000, 10000, 6000, 3000, 2000, 1000]
legend_labels = ['2020', '2021', '2022']
y = [y_2020, y_2021, y_2022]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 紅橙黃綠青藍(lán)紫
color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']
x_loc = np.arange(7)
# x軸上每個刻度上能容納的柱子的總的寬度設(shè)為0.8
total_width = 0.8
# 由y值可以看出x軸每個刻度上一共有3組數(shù)據(jù), 也即3個柱子
total_num = 3
# 每個柱子的寬度用each_width表示
each_width = total_width / total_num
if total_num % 2 == 0:
x1 = x_loc - (total_num / 2 - 1) * each_width - each_width / 2
else:
x1 = x_loc - ((total_num - 1) / 2) * each_width
x_list = [x1 + each_width * i for i in range(total_num)]
print(x_list)
# 這里顏色設(shè)置成 橙色:"#FF8C00"
for i in range(0, len(y)):
ax.bar(x_list[i], y[i], color=color_list[i], width=each_width, label=legend_labels[i])
ax.set_xticks(x_loc)
ax.set_xticklabels(x_labels)
ax.grid(True, ls=':', color='b', alpha=0.3)
ax.set_xlabel('編程語言類別', fontweight='bold')
ax.set_ylabel('編程語言用戶量(人數(shù))', fontweight='bold')
plt.title('編程語言用戶量數(shù)據(jù)分析圖', fontweight='bold', pad=25)
# 添加雙軸
ax_twinx = ax.twinx()
ax_twinx.plot(x_loc, y_2021, linestyle='-', marker='o', markersize=3, color=color_list[1], label='Middle')
fig.legend(loc='upper center', bbox_to_anchor=(0.5, 0.96), frameon=False, ncol=5, handlelength=0.9, handleheight=0.9, fontsize='small')
ax_twinx.set_ylabel('Middle', fontweight='bold')
fig.tight_layout()
fig.subplots_adjust(top=0.9)
plt.show()
-
輸出結(jié)果如下:
2.2 我們可以看到,在上述作圖過程中,我們把畫布(fig)背景色設(shè)置為#B0C4DE,把軸域(ax)背景色或者稱為繪圖區(qū)域背景色設(shè)置為white(純白色),以上圖片都是我截圖保存下來的,所以能夠保持我們對fig和ax的背景色的設(shè)置,但是如果我們想用plt.savefig()語句把圖片保存到本地,且仍然保留我們對fig和ax的背景色的設(shè)置的話,需要使用以下語句參數(shù),如下所示:
plt.savefig(picturename + '.jpg', facecolor=self.fig.get_facecolor())
# facecolor=self.fig.get_facecolor()就是需要我們添加的參數(shù), 這樣我們就能把圖片的fig和ax區(qū)域設(shè)定的背景色保存到本地了。
五、總結(jié)
以上就是今天要講的內(nèi)容,本文僅僅簡單介紹了Python中Matplotlib模塊對于繪制柱狀圖時需要注意的方面,對于不同類型的柱狀圖,我們需要設(shè)置不同的參數(shù)來調(diào)控。希望對廣大初學(xué)者網(wǎng)友有幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-460233.html
到了這里,關(guān)于Python Matplotlib數(shù)據(jù)可視化繪圖之(一)————柱狀圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!