天天看点

matplotlib数据可视化实战——饼状图+雷达图+三维图全局中文字体设置及负数显示问题饼状图绘制雷达图绘制三维图形绘制

今天又学习了两种新的图形绘制方法,并且学会了全局设置中文字体的方法。

全局中文字体设置及负数显示问题

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等,都是中文字体。

负数显示:

饼状图绘制

题目描述:

matplotlib数据可视化实战——饼状图+雷达图+三维图全局中文字体设置及负数显示问题饼状图绘制雷达图绘制三维图形绘制

代码实现:

import matplotlib.pyplot as plt
import 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=4
for 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()
           

生成图像:

matplotlib数据可视化实战——饼状图+雷达图+三维图全局中文字体设置及负数显示问题饼状图绘制雷达图绘制三维图形绘制

雷达图绘制

题目描述:

matplotlib数据可视化实战——饼状图+雷达图+三维图全局中文字体设置及负数显示问题饼状图绘制雷达图绘制三维图形绘制

代码实现:

import numpy as np
import 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数组第一个数据80
angles=np.append(angles,angles[0])#angles数组尾部追加第一个角度
#绘制雷达图polar
plt.polar(angles,  #设置角度
          scores,  #设置个角度上的数据   角度的数据共同确定一个点
          'rv--',  #设置颜色,线型和端点符号
          linewidth=2)#设置线宽
#设置角度网络标签thetagrids
plt.thetagrids(angles*180/np.pi,#转换成角度
               courses, #对应角度设置对应课程名称
               )
#填充雷达图内部
plt.fill(angles,
         scores,
         facecolor='r',#填充颜色
         alpha=0.3)#颜色透明度
plt.show()
           

三维图形绘制

题目描述:

matplotlib数据可视化实战——饼状图+雷达图+三维图全局中文字体设置及负数显示问题饼状图绘制雷达图绘制三维图形绘制

代码实现:

import numpy as np
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D #导入相应对象
import matplotlib.pyplot as plt
import matplotlib.font_manager as fm
plt.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.3
r=z**4+1
x=r*np.sin(theta)
y=r*np.cos(theta)
#绘制三位曲线,设置标签
ax.plot(x,y,z,'rv-',label='参数曲线')
#设置图例字号
mpl.rcParams['legend.fontsize']=10
ax.legend()#生成图例
plt.show()


           

图像显示:

matplotlib数据可视化实战——饼状图+雷达图+三维图全局中文字体设置及负数显示问题饼状图绘制雷达图绘制三维图形绘制