文章目录
前面五期的文章详细讲述了Python Matplotlib数据可视化绘图的方法技巧,主要涉及柱状图(《Python Matplotlib数据可视化绘图之(一)————柱状图》)、箱线图(《Python Matplotlib数据可视化绘图之(二)————箱线图》)、散点图(《Python Matplotlib数据可视化绘图之(三)————散点图》)、柱状图与折线图的叠加图(《Python Matplotlib数据可视化绘图之(四)————柱状图与折线图的叠加图》)、箱线图与散点图的叠加图(《Python Matplotlib数据可视化绘图之(五)————箱线图与散点图的叠加图》),这五类作图类型。那么,在这五期中其实有一些作图的小细节是没有在文章中详细讲解的,本期内容就详细介绍绘图过程中所涉及的一些细节,主要包括图片大小、颜色、、纵横坐标、画布、绘图区域的背景颜色、Legend图例等参数。
1. 三种调整matplotlib图片大小的方法
1.1 plt.figure(figsize=(n, n))
比如想让输出的图片大小为600x600像素:
1.1.1 代码如下:
import matplotlib.pyplot as plt# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(6, 6))# 600 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100plt.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])plt.ylabel('编程语言用户量(人数)', fontweight='bold')plt.show()
1.1.2 输出结果如下:
比如想让输出的图片大小为800x600像素:
1.1.3 代码如下:
import matplotlib.pyplot as plt# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(8, 6))# 800 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100plt.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])plt.ylabel('编程语言用户量(人数)', fontweight='bold')plt.show()
1.1.4 输出结果如下:
1.2 plt.rcParams[‘figure.figsize’]=(n, n)
这一方法可以同时对多个图片设置大小,也就是说,在写上这句话以后,不用在其他地方再写plt.figure(figsize=(n, n))这句语句了。输出的图片都是这种尺寸,如果中间想单独改变某一个图片的大小尺寸,可以再用plt.figure(figsize=(n, n))来指定图片大小即可。
import matplotlib.pyplot as pltplt.rcParams['figure.figsize']=(8, 6)# 全局设置输出图片大小 800 x 600 像素
1.2.1 代码如下:
import matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (8, 6)# 800 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsefig1 = plt.figure()fig2 = plt.figure()ax1 = fig1.add_subplot()ax2 = fig2.add_subplot()ax1.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])ax2.bar([1, 2, 3, 4, 5, 6, 7], [2000, 3000, 3000, 5000, 2000, 1000, 800])ax1.set_ylabel('编程语言用户量(人数)', fontweight='bold')ax1.set_title('fig1', fontweight='bold')ax2.set_ylabel('历年苹果产量(kg)', fontweight='bold')ax2.set_title('fig2', fontweight='bold')plt.show()
1.2.2 输出结果如下:
由结果可以看出,两张图fig1和fig2的尺寸大小都是800x600的。如果我们想改变其中一张图片(fig2)的大小为600x600的,如下面1.2.3和1.2.4所示:
1.2.3 代码如下:
import matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (8, 6)# 800 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsefig1 = plt.figure(facecolor='#B0C4DE')fig2 = plt.figure(figsize=(6, 6), facecolor='#B0C4DE')ax1 = fig1.add_subplot(facecolor='white')ax2 = fig2.add_subplot(facecolor='white')ax1.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])ax2.bar([1, 2, 3, 4, 5, 6, 7], [2000, 3000, 3000, 5000, 2000, 1000, 800])ax1.set_ylabel('编程语言用户量(人数)', fontweight='bold')ax1.set_title('fig1', fontweight='bold')ax2.set_ylabel('历年苹果产量(kg)', fontweight='bold')ax2.set_title('fig2', fontweight='bold')plt.show()
1.2.4 输出结果如下:
由结果可以看出,两张图fig1和fig2的尺寸大小像我们预期的那样,实现了fig1为800x600,fig2为600x600。
1.3 样式表+plt.style.use(‘xxx.mpstyle’)
这一方法也可以同时对多个图片设置大小,也就是说,在写上这句话以后,不用在其他地方再写plt.figure(figsize=(n, n))这句语句了。输出的图片都是这种尺寸,如果中间想单独改变某一个图片的大小尺寸,可以再用plt.figure(figsize=(n, n))来指定图片大小即可。和1.2功能一样。
1.3.1 新建文件,文件名为xxx.mpstyle,例如style.mpstyle。编辑文件内容:
figure.figsize:8,6
1.3.2 在Python文件中:
import matplotlib.pyplot as pltplt.style.use('style.mpstyle')# 样式表文件路径
如果需要对某个图片设置其他大小,使用方法一(plt.figure(figsize=(n, n)))即可。
以上就是三种调节图片大小的方式方法。
1. 图片颜色的设定
图片分为画布和轴域,fig是画布,ax是轴域
1.1 设置画布颜色为"#B0C4DE",轴域颜色为"white",则代码如下:
import matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (8, 6)# 800 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsefig1 = plt.figure(facecolor='#B0C4DE')ax1 = fig1.add_subplot(facecolor='white')ax1.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])ax1.set_ylabel('编程语言用户量(人数)', fontweight='bold')ax1.set_title('fig1', fontweight='bold')plt.show()
1.2 输出结果如下:
1.3 设置画布颜色为"#FF8C00",轴域颜色为"white",则代码如下:
import matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (8, 6)# 800 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsefig1 = plt.figure(facecolor='#FF8C00')ax1 = fig1.add_subplot(facecolor='white')ax1.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])ax1.set_ylabel('编程语言用户量(人数)', fontweight='bold')ax1.set_title('fig1', fontweight='bold')plt.show()
1.4 输出结果如下:
1. 图片的设定
图片的设定分为两种方式,一种是面向对象方式,另一种是直接方式。
1.1 方式一,面向对象,利用fig=plt.figure(), ax=fig.add_subplot(), ax.set_title(), 代码如下:
import matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (8, 6)# 800 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsefig1 = plt.figure(facecolor='#B0C4DE')ax1 = fig1.add_subplot(facecolor='white')ax1.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])ax1.set_ylabel('编程语言用户量(人数)', fontweight='bold')ax1.set_title('fig1', fontweight='bold')plt.show()
1.2 输出结果如下:
1.3 方式二,直接方式,利用plt.title(), 代码如下:
import matplotlib.pyplot as pltplt.rcParams['figure.figsize'] = (8, 6)# 800 x 600 像素(先宽度 后高度)# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsefig1 = plt.figure(facecolor='#B0C4DE')ax1 = fig1.add_subplot(facecolor='white')ax1.plot([2000, 3000, 3000, 5000, 2000, 1000, 800])ax1.set_ylabel('编程语言用户量(人数)', fontweight='bold')plt.title('fig1', fontweight='bold')plt.show()
1.4 输出结果如下:
1. 图片纵横坐标的设定
纵横坐标包括纵横坐标的刻度和刻度标签
1.1 刻度,这里我们通过设置x轴的刻度进行说明,代码如下:
import matplotlib.pyplot as pltimport numpy as np# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsex_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]y_middle = []for i in range(len(y_2020)): y_middle.append((y_2020[i] + y_2021[i] + y_2022[i]) / 3)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')# 红橙黄绿青蓝紫color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']x_loc = np.arange(7)# x轴上每个刻度上能容纳的柱子的总的宽度设为0.8total_width = 0.8# 由y值可以看出x轴每个刻度上一共有3组数据, 也即3个柱子total_num = 3# 每个柱子的宽度用each_width表示each_width = total_width / total_numif total_num % 2 == 0: x1 = x_loc - (total_num / 2 - 1) * each_width - each_width / 2else: x1 = x_loc - ((total_num - 1) / 2) * each_widthx_list = [x1 + each_width * i for i in range(total_num)]print(x_list)# 这里颜色设置成 橙色:"#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])# 设置x轴的刻度ax.set_xticks(x_loc)ax.grid(True, ls=':', color='b', alpha=0.3)ax.set_xlabel('编程语言类别', fontweight='bold')ax.set_ylabel('编程语言用户量(人数)', fontweight='bold')plt.title('编程语言用户量数据分析图', fontweight='bold', pad=25)# 添加双轴ax_twinx = ax.twinx()ax_twinx.plot(x_loc, y_middle, 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()
1.2 输出结果如下:
1.3 刻度标签,这里我们通过设置x轴的刻度标签进行说明,代码如下:
import matplotlib.pyplot as pltimport numpy as np# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = Falsex_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]y_middle = []for i in range(len(y_2020)): y_middle.append((y_2020[i] + y_2021[i] + y_2022[i]) / 3)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')# 红橙黄绿青蓝紫color_list = ['#FF0000', '#FF8C00', '#FFFF00', '#00FF00', '#00FFFF', '#0000FF', '#800080']x_loc = np.arange(7)# x轴上每个刻度上能容纳的柱子的总的宽度设为0.8total_width = 0.8# 由y值可以看出x轴每个刻度上一共有3组数据, 也即3个柱子total_num = 3# 每个柱子的宽度用each_width表示each_width = total_width / total_numif total_num % 2 == 0: x1 = x_loc - (total_num / 2 - 1) * each_width - each_width / 2else: x1 = x_loc - ((total_num - 1) / 2) * each_widthx_list = [x1 + each_width * i for i in range(total_num)]print(x_list)# 这里颜色设置成 橙色:"#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])# 设置x轴的刻度ax.set_xticks(x_loc)# 设置x轴的刻度标签ax.set_xticklabels(x_labels)ax.grid(True, ls=':', color='b', alpha=0.3)ax.set_xlabel('编程语言类别', fontweight='bold')ax.set_ylabel('编程语言用户量(人数)', fontweight='bold')plt.title('编程语言用户量数据分析图', fontweight='bold', pad=25)# 添加双轴ax_twinx = ax.twinx()ax_twinx.plot(x_loc, y_middle, 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()
1.4 输出结果如下:
1. 图片Legend(图例)的设定
图片Legend的设定,示例如下:
1.1 plt.legend()那一段代码中详细设置了每一个参数,感兴趣的可以去探索一下每一个参数带来的效果上的差别,代码如下:
import matplotlib.pyplot as pltimport numpy as np# 设置字体, 解决中文乱码问题plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']# 解决图像中的'-'负号的乱码问题plt.rcParams['axes.unicode_minus'] = FalseClassA_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就有几个箱子group_dataA = [ClassA_C, ClassA_M, ClassA_E]boxplot_dataA_CME = [ClassA_C, ClassA_M, ClassA_E]boxplot_dataB_CME = [ClassB_C, ClassB_M, ClassB_E]boxplot_dataC_CME = [ClassC_C, ClassC_M, ClassC_E]boxplot_dataABC_C = [ClassA_C, ClassB_C, ClassC_C]boxplot_dataABC_M = [ClassA_M, ClassB_M, ClassC_M]boxplot_dataABC_E = [ClassA_E, ClassB_E, ClassC_E]# 橙绿蓝color_list = ['#FF8C00', '#00FF00', '#0000FF']x_labels = ['甲班', '乙班', '丙班']legend_labels = ['语文', '数学', '英语']length = len(x_labels)x_loc = np.arange(length)labels = ['语文', '数学', '英语']group_number = len(group_dataA)total_width = 0.6box_total_width = total_width * 0.65interval_total_width = total_width * 0.35box_width = box_total_width / group_number###################################################if group_number == 1: interval_width = interval_total_widthelse: interval_width = interval_total_width / (group_number - 1)###################################################if group_number % 2 == 0: x1_box = x_loc - (group_number / 2 - 1) * box_width - box_width / 2 - (group_number / 2 - 1) * interval_width - interval_width / 2else: x1_box = x_loc - ((group_number - 1) / 2) * box_width - ((group_number - 1) / 2) * interval_widthx_list_box = [x1_box + box_width * i + interval_width * i for i in range(group_number)]x_list_box_new = []for i in range(len(group_dataA)): for j in range(len(group_dataA)): x_list_box_new.append(x_list_box[i][j])x_list_box_new = sorted(x_list_box_new)x_list_box_final = []for i in range(len(group_dataA)): x_list_box_final.append(x_list_box_new[3 * i:3 * (i + 1)])bplot1 = plt.boxplot(boxplot_dataA_CME, positions=x_list_box_final[0], widths=box_width, patch_artist=True, showfliers=False, zorder=1, labels=labels)for patch, color in zip(bplot1['boxes'], color_list): patch.set_edgecolor(color) patch.set_facecolor('None')bplot2 = plt.boxplot(boxplot_dataB_CME, positions=x_list_box_final[1], widths=box_width, patch_artist=True, showfliers=False, zorder=1, labels=labels)for patch, color in zip(bplot2['boxes'], color_list): patch.set_edgecolor(color) patch.set_facecolor('None')bplot3 = plt.boxplot(boxplot_dataC_CME, positions=x_list_box_final[2], widths=box_width, patch_artist=True, showfliers=False, zorder=1, labels=labels)for patch, color in zip(bplot3['boxes'], color_list): patch.set_edgecolor(color) patch.set_facecolor('None')################################################################################################################################################boxplot_data = [boxplot_dataABC_C, boxplot_dataABC_M, boxplot_dataABC_E]for i in range(len(boxplot_data)): # boxplot_data_num用来统计每组数据的长度, 画scatter图时会用到 boxplot_data_num = [] for j in boxplot_data[i]: boxplot_data_num_tmp = len(j) boxplot_data_num.append(boxplot_data_num_tmp) spotx = [] for j_spotx, k_spotx in zip(x_list_box[i], boxplot_data_num): spotx_tmp = [j_spotx] * k_spotx spotx.append(spotx_tmp) ax.scatter(spotx, boxplot_data[i], c=color_list[i], s=30, zorder=2)################################################################################################################################################ax.grid(True, ls=':', color='b', alpha=0.3)plt.title('甲乙丙各班语文/数学/英语成绩Box_chart分析', fontweight='bold')ax.set_xticks(x_loc)ax.set_xticklabels(x_labels, rotation=90)ax.set_ylabel('分数/百分制', fontweight='bold')################################################################################################################################################################################################################################plt.legend(handles=bplot1['boxes'], 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', labels=legend_labels)################################################################################################################################################################################################################################plt.xticks(weight='bold')plt.yticks(weight='bold')fig.tight_layout()plt.show()
1.2 输出结果如下:
本文主要讲了关于图片的大小、颜色、、纵横坐标、画布和绘图区域背景颜色、Legend(图例)等参数设置的方式方法,希望对Python可视化绘图领域感兴趣的有所帮助。
来源地址:https://blog.csdn.net/Mr_Dragon66/article/details/127814277