前言
前面五期的文章详细讲述了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'] = False
plt.figure(figsize=(6, 6))
# 600 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
plt.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'] = False
plt.figure(figsize=(8, 6))
# 800 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
plt.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 plt
plt.rcParams['figure.figsize']=(8, 6)
# 全局设置输出图片大小 800 x 600 像素
1.2.1 代码如下:
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8, 6)
# 800 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
plt.rcParams['axes.unicode_minus'] = False
fig1 = 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 plt
plt.rcParams['figure.figsize'] = (8, 6)
# 800 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
plt.rcParams['axes.unicode_minus'] = False
fig1 = 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 plt
plt.style.use('style.mpstyle')
# 样式表文件路径
如果需要对某个图片设置其他大小,使用方法一(plt.figure(figsize=(n, n)))即可。
以上就是三种调节图片大小的方式方法。
二、图片颜色的设定和调节
1. 图片颜色的设定
图片分为画布和轴域,fig是画布,ax是轴域
1.1 设置画布颜色为"#B0C4DE",轴域颜色为"white",则代码如下:
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = (8, 6)
# 800 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
plt.rcParams['axes.unicode_minus'] = False
fig1 = 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 plt
plt.rcParams['figure.figsize'] = (8, 6)
# 800 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
plt.rcParams['axes.unicode_minus'] = False
fig1 = 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 plt
plt.rcParams['figure.figsize'] = (8, 6)
# 800 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
plt.rcParams['axes.unicode_minus'] = False
fig1 = 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 plt
plt.rcParams['figure.figsize'] = (8, 6)
# 800 x 600 像素(先宽度 后高度)
# 注意这里的宽度和高度的单位是英寸,1英寸=100像素,所以要除以100
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
plt.rcParams['axes.unicode_minus'] = False
fig1 = 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 plt
import numpy as np
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
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]
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.8
total_width = 0.8
# 由y值可以看出x轴每个刻度上一共有3组数据, 也即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)
# 这里颜色设置成 橙色:"#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 plt
import numpy as np
# 设置字体, 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
# 解决图像中的'-'负号的乱码问题
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]
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.8
total_width = 0.8
# 由y值可以看出x轴每个刻度上一共有3组数据, 也即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)
# 这里颜色设置成 橙色:"#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 输出结果如下:
五、图片Legend(图例)的设定和调节
1. 图片Legend(图例)的设定
图片Legend的设定,示例如下:
1.1 plt.legend()那一段代码中详细设置了每一个参数,感兴趣的可以去探索一下每一个参数带来的效果上的差别,代码如下:
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就有几个箱子
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.6
box_total_width = total_width * 0.65
interval_total_width = total_width * 0.35
box_width = box_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_box = x_loc - (group_number / 2 - 1) * box_width - box_width / 2 - (group_number / 2 - 1) * interval_width - interval_width / 2
else:
x1_box = x_loc - ((group_number - 1) / 2) * box_width - ((group_number - 1) / 2) * interval_width
x_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 输出结果如下:
文章来源:https://www.toymoban.com/news/detail-463987.html
六、总结
本文主要讲了关于图片的大小、颜色、标题、纵横坐标、画布和绘图区域背景颜色、Legend(图例)等参数设置的方式方法,希望对Python可视化绘图领域感兴趣的有所帮助。文章来源地址https://www.toymoban.com/news/detail-463987.html
到了这里,关于Python Matplotlib数据可视化绘图之(六)————图片大小、颜色、标题、纵横坐标、画布和绘图区域背景颜色、Legend(图例)等的参数设置详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!