今天又学习了两种新的图形绘制方法,并且学会了全局设置中文字体的方法。
全局中文字体设置及负数显示问题
plt.rcParams[\'font.family\'] = \'sans-serif\'plt.rcParams[\'font.sans-serif\'] = \'SimHei\'#SimHei是一种中文字体
如果显示出来是一些小方块而不是中文,那是因为在matplotlib的配置文件下没有找到合适的中文字体
解决方法如下:
1.在C:\\Users\\ht\\Anaconda3\\Lib\\site-packages\\matplotlib\\mpl-data文件下找到matplotlibrc
2.找到font.sans-serif,在后面直接添加中文字体后保存即可。
例如:SimHei, Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif等,都是中文字体。
负数显示:
plt.rcParams[\'axes.unicode_minus\']=False
饼状图绘制
题目描述:
代码实现:
import matplotlib.pyplot as pltimport matplotlib.font_manager as fm #用来导入图例from itertools import groupby #用来分组#统一设置图形中中文字体plt.rcParams[\'font.family\'] = \'sans-serif\'plt.rcParams[\'font.sans-serif\'] = \'SimHei\'#每门课成绩scores={\'数据结构\':[89,70,49,87,92,84,73,71,78,81,90,37,77,82,81,79,80,82,75,90,54,80,70,60,61],\'线性代数\':[70,74,80,60,50,87,68,77,95,80,79,74,69,64,82,81,78,90,78,79,72,69,45,70,70],\'英语\':[83,87,69,55,80,89,96,81,83,90,54,70,79,66,85,82,88,76,60,80,75,83,75,70,20],\'python\':[90,60,82,79,88,92,85,87,89,71,45,50,80,81,87,93,80,70,68,65,85,89,90,72,75]}#自定义分组函数def splitScore(score):if score>=85:return \'优\'elif score>=60:return \'及格\'else:return \'不及格\'#统计每门课程中优,及格,不及格的人数ratios=dict()#定义一个空字典for subject,subjectScore in scores.items():#items返回多个元素,每个元素包括键和值ratios[subject]={}#groupby()函数需要对原始数据进行排序才能正确分类for category,num in groupby(sorted(subjectScore),splitScore):ratios[subject][category]=len(tuple(num))#tuple返回对应类别的成绩数目#ratios的格式为{\'课程名称\':{\'优\':3,\'及格\':5,\'不及格\':1}}#创建四个子图fig,axs=plt.subplots(2,2)#把绘图区域分成两行两列axs.shape=4for index,subjectData in enumerate(ratios.items()):#获得下标来选择往哪一个子图绘制plt.sca(axs[index])subjectName,subjectRatio=subjectData#把subjectData的第一项交给subjecName,第二项交给subjectRatio#用函数pie绘制饼状图plt.pie(list(subjectRatio.values()),#每个扇形对应的数值labels=list(subjectRatio.keys()),#每个扇形的标签autopct=\'%1.1f%%\')#百分比格式显示 第一个百分号表示要引导一个格式,f表示实数,最后两个百分号显示为一个百分号,.1表示保留一位小数plt.xlabel(subjectName)#每个扇形的名称plt.legend()#自动生成图例plt.gca().set_aspect(\'equal\')#设置纵横比相等plt.show()
生成图像:
雷达图绘制
题目描述:
代码实现:
import numpy as npimport matplotlib.pyplot as plt#设置全局中文字体plt.rcParams[\'font.family\'] = \'sans-serif\'plt.rcParams[\'font.sans-serif\'] = \'SimHei\'#某学生的课程与成绩courses=[\'c++\',\'python\',\'高数\',\'大学英语\',\'软件工程\',\'组成原理\',\'数字图像处理\',\'计算机图形学\']scores=[80,95,78,85,45,65,80,60]datalength=len(scores)#angles数组把圆周等分成datalength份#linspace用来生成等差数组angles=np.linspace(0, #数组第一个数据2*np.pi, #数组最后一个数据datalength, #数组中数据数量endpoint=False #不包含终点)scores.append(scores[0])#列表尾部追加scores数组第一个数据80angles=np.append(angles,angles[0])#angles数组尾部追加第一个角度#绘制雷达图polarplt.polar(angles, #设置角度scores, #设置个角度上的数据 角度的数据共同确定一个点\'rv--\', #设置颜色,线型和端点符号linewidth=2)#设置线宽#设置角度网络标签thetagridsplt.thetagrids(angles*180/np.pi,#转换成角度courses, #对应角度设置对应课程名称)#填充雷达图内部plt.fill(angles,scores,facecolor=\'r\',#填充颜色alpha=0.3)#颜色透明度plt.show()
三维图形绘制
题目描述:
代码实现:
import numpy as npimport matplotlib as mplfrom mpl_toolkits.mplot3d import Axes3D #导入相应对象import matplotlib.pyplot as pltimport matplotlib.font_manager as fmplt.rcParams[\'font.family\'] = \'sans-serif\'plt.rcParams[\'font.sans-serif\'] = \'SimHei\' #设置全局字体plt.rcParams[\'axes.unicode_minus\']=False #解决负数显示问题#声明要创建三维子图fig=plt.figure()ax=fig.gca(projection=\'3d\')#生成测试数据theta=np.linspace(-4*np.pi,4*np.pi,100)#100个数据的等差数组z=np.linspace(-4,4,100)*0.3r=z**4+1x=r*np.sin(theta)y=r*np.cos(theta)#绘制三位曲线,设置标签ax.plot(x,y,z,\'rv-\',label=\'参数曲线\')#设置图例字号mpl.rcParams[\'legend.fontsize\']=10ax.legend()#生成图例plt.show()
图像显示: