文本
前言
本文我們主要介紹利用Python中的Matplotlib模塊進行幾種散點圖的畫法,包括整張圖片只有一種顏色的不分組散點圖、整張圖片有好幾種顏色的不分組散點圖、整張圖片有好幾種顏色的分組散點圖等。
一、所用到的模塊
主要利用Python中的Matplotlib模塊完成該功能。
二、單一顏色的普通不分組散點圖
1.示例數(shù)據(jù)如下
表格如下(示例):
班別 | 語文成績(分/100分制) |
---|---|
甲班 | 80 |
90 | |
75 | |
65 | |
85 | |
95 | |
100 | |
100 | |
80 | |
70 | |
90 | |
95 | |
85 | |
86 | |
92 | |
90 | |
95 | |
90 | |
85 | |
100 | |
乙班 | 60 |
70 | |
80 | |
65 | |
75 | |
80 | |
73 | |
75 | |
85 | |
90 | |
95 | |
65 | |
70 | |
75 | |
80 | |
85 | |
95 | |
85 | |
80 | |
70 | |
丙班 | 60 |
80 | |
100 | |
100 | |
100 | |
100 | |
90 | |
95 | |
95 | |
95 | |
85 | |
95 | |
95 | |
95 | |
95 | |
80 | |
95 | |
90 | |
90 | |
90 |
現(xiàn)在需要把表格中的數(shù)據(jù)繪制成散點圖,從而進一步分析每個班級的學生成績情況。
2.代碼如下
2.1 代碼如下(示例):
2.1.1 Case1:
import matplotlib.pyplot as plt
# 設置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
# A班的語文成績
ClassA_C = [80, 90, 75, 65, 85, 95, 100, 100, 80, 70, 90, 95, 85, 86, 92, 90, 95, 90, 85, 100]
# B班的語文成績
ClassB_C = [60, 70, 80, 65, 75, 80, 73, 75, 85, 90, 95, 65, 70, 75, 80, 85, 95, 85, 80, 70]
# C班的語文成績
ClassC_C = [60, 80, 100, 100, 100, 100, 90, 95, 95, 95, 85, 95, 95, 95, 95, 80, 95, 90, 90, 90]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 橙綠藍
color_list = ['#FF8C00', '#00FF00', '#0000FF']
x_labels = ['甲班', '乙班', '丙班']
x_loc = [1, 2, 3]
scatter_plot_data = [ClassA_C, ClassB_C, ClassC_C]
# 每個數(shù)據(jù)(scatter_plot_data里面的每個數(shù)據(jù))對應的x軸的坐標值
spotx = []
for i, j in zip(x_loc, range(len(scatter_plot_data))):
spotx_tmp = [i] * len(scatter_plot_data[j])
spotx.append(spotx_tmp)
ax.scatter(spotx, scatter_plot_data, c=color_list[0], s=30)
ax.grid(True, ls=':', color='b', alpha=0.3)
plt.title('甲乙丙各班語文成績Scatter_chart分析', fontweight='bold')
ax.set_xticks(x_loc)
ax.set_xticklabels(x_labels, rotation=90)
ax.set_ylabel('分數(shù)/百分制', fontweight='bold')
# 設置x, y坐標軸的刻度標簽字體加粗
plt.xticks(weight='bold')
plt.yticks(weight='bold')
fig.tight_layout()
plt.show()
輸出結(jié)果如下:
注意:如果想保存這種畫布帶背景顏色且軸域也帶背景顏色的圖片(在此圖中,畫布[fig]背景顏色為#B0C4DE,軸域[ax]背景顏色為white),需要使用以下語句保存到本地,具體語句如下:文章來源:http://www.zghlxwxcb.cn/news/detail-729259.html
plt.savefig(picture_name + '.jpg', facecolor=self.fig.get_facecolor())
# 其中picture_name為給圖片命的名字
三、多種顏色的普通不分組散點圖
1.示例數(shù)據(jù)如下
表格如下(示例):
班別 | 語文成績(分/100分制) |
---|---|
甲班 | 80 |
90 | |
75 | |
65 | |
85 | |
95 | |
100 | |
100 | |
80 | |
70 | |
90 | |
95 | |
85 | |
86 | |
92 | |
90 | |
95 | |
90 | |
85 | |
100 | |
乙班 | 60 |
70 | |
80 | |
65 | |
75 | |
80 | |
73 | |
75 | |
85 | |
90 | |
95 | |
65 | |
70 | |
75 | |
80 | |
85 | |
95 | |
85 | |
80 | |
30 | |
丙班 | 60 |
80 | |
100 | |
100 | |
100 | |
100 | |
90 | |
95 | |
95 | |
95 | |
85 | |
95 | |
95 | |
95 | |
95 | |
80 | |
95 | |
90 | |
90 | |
90 |
現(xiàn)在需要把表格中的數(shù)據(jù)繪制成散點圖,從而進一步分析每個班級的學生成績情況。
2.代碼如下
2.1 代碼如下(示例):
2.1.1 Case1:
import matplotlib.pyplot as plt
# 設置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
# A班的語文成績
ClassA_C = [80, 90, 75, 65, 85, 95, 100, 100, 80, 70, 90, 95, 85, 86, 92, 90, 95, 90, 85, 100]
# B班的語文成績
ClassB_C = [60, 70, 80, 65, 75, 80, 73, 75, 85, 90, 95, 65, 70, 75, 80, 85, 95, 85, 80, 30]
# C班的語文成績
ClassC_C = [60, 80, 100, 100, 100, 100, 90, 95, 95, 95, 85, 95, 95, 95, 95, 80, 95, 90, 90, 90]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 橙綠藍
color_list = ['#FF8C00', '#00FF00', '#0000FF']
# 'o':圓圈; 'D':鉆石; 's':正方形
marker_list = ['o', 'D', 's']
x_labels = ['甲班', '乙班', '丙班']
x_loc = [1, 2, 3]
scatter_plot_data = [ClassA_C, ClassB_C, ClassC_C]
# 每個數(shù)據(jù)(scatter_plot_data里面的每個數(shù)據(jù))對應的x軸的坐標值
spotx = []
for i, j in zip(x_loc, range(len(scatter_plot_data))):
spotx_tmp = [i] * len(scatter_plot_data[j])
spotx.append(spotx_tmp)
# 每個數(shù)據(jù)(scatter_plot_data里面的每個數(shù)據(jù))對應的marker的顏色
color_list_x = []
color_list_x_final = []
for i, j in zip(color_list, range(len(scatter_plot_data))):
color_list_x_tmp = [i] * len(scatter_plot_data[j])
color_list_x.append(color_list_x_tmp)
for i in color_list_x:
for j in i:
color_list_x_final.append(j)
ax.scatter(spotx, scatter_plot_data, c=color_list_x_final, s=30, marker='o')
ax.grid(True, ls=':', color='b', alpha=0.3)
plt.title('甲乙丙各班語文成績Scatter_chart分析', fontweight='bold')
ax.set_xticks(x_loc)
ax.set_xticklabels(x_labels, rotation=90)
ax.set_ylabel('分數(shù)/百分制', fontweight='bold')
# 設置x, y坐標軸的刻度標簽字體加粗
plt.xticks(weight='bold')
plt.yticks(weight='bold')
fig.tight_layout()
plt.show()
輸出結(jié)果如下:
注意:如果想保存這種畫布帶背景顏色且軸域也帶背景顏色的圖片(在此圖中,畫布[fig]背景顏色為#B0C4DE,軸域[ax]背景顏色為white),需要使用以下語句保存到本地,具體語句如下:
plt.savefig(picture_name + '.jpg', facecolor=self.fig.get_facecolor())
# 其中picture_name為給圖片命的名字
2.1.2 Case2:
import matplotlib.pyplot as plt
# 設置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
# A班的語文成績
ClassA_C = [80, 90, 75, 65, 85, 95, 100, 100, 80, 70, 90, 95, 85, 86, 92, 90, 95, 90, 85, 100]
# B班的語文成績
ClassB_C = [60, 70, 80, 65, 75, 80, 73, 75, 85, 90, 95, 65, 70, 75, 80, 85, 95, 85, 80, 30]
# C班的語文成績
ClassC_C = [60, 80, 100, 100, 100, 100, 90, 95, 95, 95, 85, 95, 95, 95, 95, 80, 95, 90, 90, 90]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
# 橙綠藍
color_list = ['#FF8C00', '#00FF00', '#0000FF']
# 'o':圓圈; 'D':鉆石; 's':正方形
marker_list = ['o', 'D', 's']
x_labels = ['甲班', '乙班', '丙班']
x_loc = [1, 2, 3]
scatter_plot_data = [ClassA_C, ClassB_C, ClassC_C]
# 每個數(shù)據(jù)(scatter_plot_data里面的每個數(shù)據(jù))對應的x軸的坐標值
spotx = []
for i, j in zip(x_loc, range(len(scatter_plot_data))):
spotx_tmp = [i] * len(scatter_plot_data[j])
spotx.append(spotx_tmp)
#############################################################
#############################################################
# 每個數(shù)據(jù)(scatter_plot_data里面的每個數(shù)據(jù))對應的marker的形狀
marker_list_x = []
marker_list_x_final = []
for i, j in zip(marker_list, range(len(scatter_plot_data))):
marker_list_x_tmp = [i] * len(scatter_plot_data[j])
marker_list_x.append(marker_list_x_tmp)
for i in marker_list_x:
for j in i:
marker_list_x_final.append(j)
#############################################################
#############################################################
# 每個數(shù)據(jù)(scatter_plot_data里面的每個數(shù)據(jù))對應的marker的顏色
color_list_x = []
color_list_x_final = []
for i, j in zip(color_list, range(len(scatter_plot_data))):
color_list_x_tmp = [i] * len(scatter_plot_data[j])
color_list_x.append(color_list_x_tmp)
for i in color_list_x:
for j in i:
color_list_x_final.append(j)
ax.scatter(spotx, scatter_plot_data, c=color_list_x_final, s=30, marker=marker_list_x_final)
ax.grid(True, ls=':', color='b', alpha=0.3)
plt.title('甲乙丙各班語文成績Scatter_chart分析', fontweight='bold')
ax.set_xticks(x_loc)
ax.set_xticklabels(x_labels, rotation=90)
ax.set_ylabel('分數(shù)/百分制', fontweight='bold')
# 設置x, y坐標軸的刻度標簽字體加粗
plt.xticks(weight='bold')
plt.yticks(weight='bold')
fig.tight_layout()
plt.show()
輸出結(jié)果如下:
注意:這里我們可以看到此時程序運行的時候報錯,而2.1.2 Case2 與2.1.1 Case1 相比僅僅只是多了如下幾行代碼:
#############################################################
#############################################################
# 每個數(shù)據(jù)(scatter_plot_data里面的每個數(shù)據(jù))對應的marker的形狀
marker_list_x = []
marker_list_x_final = []
for i, j in zip(marker_list, range(len(scatter_plot_data))):
marker_list_x_tmp = [i] * len(scatter_plot_data[j])
marker_list_x.append(marker_list_x_tmp)
for i in marker_list_x:
for j in i:
marker_list_x_final.append(j)
#############################################################
#############################################################
這幾行代碼的目的本來是想給每組數(shù)據(jù)(scatter_plot_data里面包含三組數(shù)據(jù):[ClassA_C, ClassB_C, ClassC_C])賦予不同的marker形狀類型,但是這樣行不通,原因是ax.scatter()在一次繪圖中只能接受一種marker類型,若想賦予多種marker類型,需要多次調(diào)用ax.scatter(),但這顯然不符合我們的本次繪圖的主要意圖。這種情況的繪圖詳見本文中第四部分所講內(nèi)容。
注意:如果想保存這種畫布帶背景顏色且軸域也帶背景顏色的圖片(在此圖中,畫布[fig]背景顏色為#B0C4DE,軸域[ax]背景顏色為white),需要使用以下語句保存到本地,具體語句如下:
plt.savefig(picture_name + '.jpg', facecolor=self.fig.get_facecolor())
# 其中picture_name為給圖片命的名字
四、多種顏色的普通分組散點圖
1.示例數(shù)據(jù)如下
表格如下(示例):
班別 | 語文成績(分/100分制) | 數(shù)學成績(分/100分制) | 英語成績(分/100分制) |
---|---|---|---|
甲班 | 80 | 70 | 90 |
90 | 90 | 100 | |
75 | 95 | 100 | |
65 | 85 | 85 | |
85 | 75 | 75 | |
95 | 85 | 90 | |
100 | 90 | 100 | |
100 | 100 | 100 | |
80 | 100 | 75 | |
70 | 85 | 70 | |
90 | 90 | 85 | |
95 | 95 | 90 | |
85 | 98 | 95 | |
86 | 99 | 95 | |
92 | 85 | 90 | |
90 | 88 | 80 | |
95 | 86 | 70 | |
90 | 75 | 80 | |
85 | 78 | 70 | |
100 | 90 | 75 | |
乙班 | 60 | 60 | 70 |
70 | 70 | 75 | |
80 | 75 | 75 | |
65 | 80 | 70 | |
75 | 75 | 60 | |
80 | 75 | 90 | |
73 | 65 | 98 | |
75 | 80 | 95 | |
85 | 60 | 85 | |
90 | 80 | 75 | |
95 | 90 | 70 | |
65 | 95 | 60 | |
70 | 95 | 65 | |
75 | 90 | 70 | |
80 | 80 | 75 | |
85 | 85 | 75 | |
95 | 75 | 80 | |
85 | 75 | 75 | |
80 | 60 | 70 | |
70 | 65 | 80 | |
丙班 | 60 | 100 | 80 |
80 | 100 | 90 | |
100 | 100 | 100 | |
100 | 95 | 100 | |
100 | 95 | 100 | |
100 | 95 | 90 | |
90 | 95 | 95 | |
95 | 95 | 95 | |
95 | 90 | 95 | |
95 | 85 | 90 | |
85 | 90 | 95 | |
95 | 90 | 90 | |
95 | 90 | 95 | |
95 | 95 | 90 | |
95 | 90 | 95 | |
80 | 95 | 90 | |
95 | 95 | 95 | |
90 | 95 | 90 | |
90 | 95 | 95 | |
90 | 90 | 85 |
現(xiàn)在需要把表格中的數(shù)據(jù)繪制成散點圖,從而進一步分析每個班級的學生成績情況。
2.代碼如下
2.1 代碼如下(示例):
2.1.1 Case1:
import matplotlib.pyplot as plt
import numpy as np
# 設置字體, 解決中文亂碼問題
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解決圖像中的'-'負號的亂碼問題
plt.rcParams['axes.unicode_minus'] = False
ClassA_C = [80, 90, 75, 65, 85, 95, 100, 100, 80, 70, 90, 95, 85, 86, 92, 90, 95, 90, 85, 100]
ClassA_M = [70, 90, 95, 85, 75, 85, 90, 100, 100, 85, 90, 95, 98, 99, 85, 88, 86, 75, 78, 90]
ClassA_E = [90, 100, 100, 85, 75, 90, 100, 100, 75, 70, 85, 90, 95, 95, 90, 80, 70, 80, 70, 75]
ClassB_C = [60, 70, 80, 65, 75, 80, 73, 75, 85, 90, 95, 65, 70, 75, 80, 85, 95, 85, 80, 70]
ClassB_M = [60, 70, 75, 80, 75, 75, 65, 80, 60, 80, 90, 95, 95, 90, 80, 85, 75, 75, 60, 65]
ClassB_E = [70, 75, 75, 70, 60, 90, 98, 95, 85, 75, 70, 60, 65, 70, 75, 75, 80, 75, 70, 80]
ClassC_C = [60, 80, 100, 100, 100, 100, 90, 95, 95, 95, 85, 95, 95, 95, 95, 80, 95, 90, 90, 90]
ClassC_M = [100, 100, 100, 95, 95, 95, 95, 95, 90, 85, 90, 90, 90, 95, 90, 95, 95, 95, 95, 90]
ClassC_E = [80, 90, 100, 100, 100, 90, 95, 95, 95, 90, 95, 90, 95, 90, 95, 90, 95, 90, 95, 85]
fig = plt.figure(figsize=(8, 6), facecolor='#B0C4DE')
ax = fig.add_subplot(facecolor='white')
group_dataA = [ClassA_C, ClassA_M, ClassA_E]
scatter_dataABC_C = [ClassA_C, ClassB_C, ClassC_C]
scatter_dataABC_M = [ClassA_M, ClassB_M, ClassC_M]
scatter_dataABC_E = [ClassA_E, ClassB_E, ClassC_E]
# 橙綠藍
color_list = ['#FF8C00', '#00FF00', '#0000FF']
# 'o':圓圈; 'D':鉆石; 's':正方形
marker_list = ['o', 'D', 's']
x_labels = ['甲班', '乙班', '丙班']
legend_labels = ['語文', '數(shù)學', '英語']
length = len(x_labels)
x_loc = np.arange(length)
# 統(tǒng)計每個刻度標簽下有幾個group
group_number = len(group_dataA)
total_width = 0.5
scatter_total_width = total_width * 0.65
interval_total_width = total_width * 0.35
scatter_width = scatter_total_width / group_number
###################################################
if group_number == 1:
interval_width = interval_total_width
else:
interval_width = interval_total_width / (group_number - 1)
###################################################
if group_number % 2 == 0:
x1_scatter = x_loc - (group_number / 2 - 1) * scatter_width - scatter_width / 2 - (group_number / 2 - 1) * interval_width - interval_width / 2
else:
x1_scatter = x_loc - ((group_number - 1) / 2) * scatter_width - ((group_number - 1) / 2) * interval_width
x_list_scatter = [x1_scatter + scatter_width * i + interval_width * i for i in range(group_number)]
###################################################
scatter_data = [scatter_dataABC_C, scatter_dataABC_M, scatter_dataABC_E]
for i in range(len(scatter_data)):
##################################################################
# scatter_data_num用來統(tǒng)計每組數(shù)據(jù)的長度, 畫scatter圖時會用到
scatter_data_num = []
for j in scatter_data[i]:
scatter_data_num_tmp = len(j)
scatter_data_num.append(scatter_data_num_tmp)
##################################################################
# 畫scatter
# spotx是每一組scatter所有的點的橫坐標
spotx = []
for j_spotx, k_spotx in zip(x_list_scatter[i], scatter_data_num):
spotx_tmp = [j_spotx] * k_spotx
spotx.append(spotx_tmp)
# print('$$$spotx:', spotx)
ax.scatter(spotx, scatter_data[i], c=color_list[i], s=30, label=legend_labels[i], marker=marker_list[i])
##################################################################
ax.grid(True, ls=':', color='b', alpha=0.3)
plt.title('甲乙丙各班語文/數(shù)學/英語成績Scatter_chart分析', fontweight='bold')
ax.set_xticks(x_loc)
ax.set_xticklabels(x_labels, rotation=90)
ax.set_ylabel('分數(shù)/百分制', fontweight='bold')
################################################################################################################
################################################################################################################
plt.legend(title='學科', loc='center left', bbox_to_anchor=(1.02, 0.5), facecolor='None', edgecolor='#000000',
frameon=True, ncol=1, markerscale=3, borderaxespad=0, handletextpad=0.1, fontsize='x-large', title_fontsize='x-large')
################################################################################################################
################################################################################################################
plt.xticks(weight='bold')
plt.yticks(weight='bold')
fig.tight_layout()
plt.show()
輸出結(jié)果如下:
注意:如果想保存這種畫布帶背景顏色且軸域也帶背景顏色的圖片(在此圖中,畫布[fig]背景顏色為#B0C4DE,軸域[ax]背景顏色為white),需要使用以下語句保存到本地,具體語句如下:
plt.savefig(picture_name + '.jpg', facecolor=self.fig.get_facecolor())
# 其中picture_name為給圖片命的名字
五、總結(jié)
以上就是今天要講的內(nèi)容,本文詳細介紹了各種散點圖的繪制過程和方法,并用實例給大家演示了具體的實現(xiàn)代碼和實現(xiàn)邏輯,希望對大家學習畫散點圖有幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-729259.html
到了這里,關(guān)于Python Matplotlib數(shù)據(jù)可視化繪圖之(三)————散點圖的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!