matplotlib绘图

使用matplotlib绘图中文字符显示问题:UserWarning: missing from current font.

在用matplotlib进行绘图时,如果在绘制过程中会用到中文,则默认情况下会出现字体警告,中文字符显示为方框或乱码的形式
警告信息中提示“missing from current font”,直译就是“在当前字体中缺少(中文字符)”,大概含义就是默认的字体中不含中文字符。

对于这类问题,核心就是设置绘制图片时的字体参数包含全部的需要用到的字符

在解决中文字符显示问题时,有两类方案多种方式:

方案1,在绘图代码中设置全局字符显示字体;

Python脚本中动态设置matplotlibrc,这样也可以避免由于更改配置文件而造成的麻烦

from pylab import mpl
# 设置显示中文字体
mpl.rcParams["font.sans-serif"] = ["SimHei"]

有时候,字体更改后,会导致坐标轴中的部分字符无法正常显示,

此时需要更改axes.unicode_minus参数:

# 设置正常显示符号
mpl.rcParams["axes.unicode_minus"] = False

注意: 

rcParams修改 font.sans-serif 或 font.family 对应字体

# 以下代码从全局设置字体为SimHei(黑体),解决显示中文问题【Windows】

# 设置font.sans-serif 或 font.family 均可

plt.rcParams['font.sans-serif'] = ['SimHei']

# plt.rcParams['font.family']=['SimHei']

# 解决中文字体下坐标轴负数的负号显示问题

plt.rcParams['axes.unicode_minus'] = False 

由于mac电脑默认没有SimHei(黑体)字体,大家可以下载安装该字体或者修改为系统自带的字体如Arial Unicode MS,如下:

# 以下代码从全局设置字体为Arial Unicode MS,解决显示中文问题【mac】

# 设置font.sans-serif 或 font.family 均可

plt.rcParams['font.sans-serif'] = ['Arial Unicode MS']

# plt.rcParams['font.family']=['Arial Unicode MS']

# 解决中文字体下坐标轴负数的负号显示问题

plt.rcParams['axes.unicode_minus'] = False 

rc方法,其实和设置rcParams 基本等效

# 设置font字典为 SimSun(宋体),大小为12(默认为10)

font = {'family' : 'SimSun',

        'size'  : '12'}

# 设置 字体

plt.rc('font', **font)

# 解决中文字体下坐标轴负数的负号显示问题        

plt.rc('axes', unicode_minus=False) 

!! 比如:rc('lines', linewidth=2, color='r') 等效于以下:

rcParams['lines.linewidth'] = 2

rcParams['lines.color'] = 'r'

方案2,在绘图代码中设置局部字体;

FontProperties对象,这种情况下不需要额外处理负号问题

import matplotlib.pyplot as plt
import numpy as np
# 引入matplotlib字体管理 FontProperties
from matplotlib.font_manager import FontProperties
 
# 设置我们需要用到的中文字体(字体文件地址)
my_font = FontProperties(fname=r"c:\windows\fonts\SimHei.ttf", size=12)
# Data for plotting
t = np.arange(-1.0, 1.0, 0.01)
s = 1 + np.sin(2 * np.pi * t)
 
plt.plot(t, s)
 
# 设置 x轴名称字体
plt.xlabel('时间 (s)', fontproperties=my_font)
plt.ylabel('voltage (mV)')
# 设置 标题字体
plt.title('简单的标题', fontproperties=my_font)
 
plt.show()

方案3,修改本机字符默认配置的字体。

可以直接修改本机字符默认配置字体,不过代码只在本机适用。

  • 步骤一:下载 SimHei字体(或者其他的支持中文显示的字体也行)
  • 步骤二:安装字体
  • windows和mac下:双击安装
  • 步骤三:修改配置文件matplotlibrc 查找配置文件路径:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
 
print(matplotlib.matplotlib_fname())  # 此处输出的就是配置文件的路径

打开文件查看

将文件内容修改为:

font.family: sans-serif
font.sans-serif: SimHei
axes.unicode_minus: False

在以下地方#font.sans-serif新增支持中文字符的字体如:SimSun(宋体),

也可以直接修改#font.family:  SimSun

考虑到 中文字体下 负号的显示问题,同步需要修改#axes.unicode_minus: False

修改True为False

Matplotlib中文乱码解决方案(两种方式)

Matplotlib 默认不支持中文字体,这因为 Matplotlib 只支持 ASCII 字符

如何在 Windows 环境下让 Matplotlib 显示中文

重写配置文件

通过临时重写配置文件的方法,可以解决 Matplotlib 显示中文乱码的问题,代码如下所示:

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["SimHei"] #设置字体
plt.rcParams["axes.unicode_minus"]=False #该语句解决图像中的“-”负号的乱码问题

上述解决方案适用于所有操作系统,其唯一弊端是每编写一个绘图程序就要添加一次相同的代码。

python matplotlib 中文显示参数设置 - michael翔的IT私房菜 - SegmentFault 思否

修改配置文件

第二种方式:通过直接修改配置文件的方法,

可以一劳永逸的解决 Matplotlib 的中文乱码问题。注意此过程在 Windows 环境下进行。

Matplotlib 从配置文件 matplotlibrc 中读取相关配置信息,

比如字体、样式等,因此需要对该配置文件进行更改。

首先查看 matplotlibrc 所在的目录,使用如下代码确定目录位置:

import matplotlib
matplotlib.matplotlib_fname()

输出结果:

D:\python\python37\lib\site-packages\matplotlib\mpl-data\matplotlibrc

然后修改配置文件 matplotlibrc。打开配置文件后,找到以下信息:

#font.family: sans-serif

#font.serif: DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif

将上述配置项前面的#去掉,并修改的配置项,如下所示:

font.family   :  Microsoft YaHei, sans-serif

font.serif: Microsoft YaHei, DejaVu Serif, Bitstream Vera Serif, Computer Modern Roman, New Century Schoolbook, Century Schoolbook L, Utopia, ITC Bookman, Bookman, Nimbus Roman No9 L, Times New Roman, Times, Palatino, Charter, serif

注意,由于版本问题,上述内容配置信息可能存在一些差异,请自动忽略。

最后,在以下目录中复制中文字体微软雅黑:

C:\Windows\Fonts\Microsoft YaHei UI

复制完成后,将字体粘贴至以下路径文件中:

D:\python\python37\lib\site-packages\matplotlib\mpl-data\fonts\ttf

字体粘贴后会出现一个 MSYH.ttc 的字体文件

matplotlib之pyplot模块之柱状图(bar():基础参数、外观参数)

bar()函数概述

用于绘制柱状图。

matplotlib.pyplot.bar(x, height, width=0.8, bottom=None, *, align='center', data=None, **kwargs)

bar()的返回值为BarContainer对象,其中patche属性为Rectangle列表,即一系列柱子。

bar()函数基础参数

x:柱子在x轴上的坐标。浮点数或类数组结构。注意x可以为字符串数组!

height:柱子的高度,即y轴上的坐标。浮点数或类数组结构。

width:柱子的宽度。浮点数或类数组结构。默认值为0.8。

bottom:柱子的基准高度。浮点数或类数组结构。默认值为0。

align:柱子在x轴上的对齐方式。字符串,取值范围为{'center', 'edge'},默认为'center'。

'center':x位于柱子的中心位置。

'edge':x位于柱子的左侧。如果想让x位于柱子右侧,需要同时设置负width 以及align='edge'。

柱子的位置由x以及align确定 ,柱子的尺寸由height和 width 确定。

垂直基准位置由bottom确定(默认值为0)。

大部分参数即可以是单独的浮点值也可以是值序列,单独值对所有柱子生效,值序列一一对应每个柱子。

bar()函数外观参数

bar()函数外观参数均为可选参数,具体如下:

color:柱子的填充色。颜色值或颜色值序列。

edgecolor:柱子边缘的颜色。颜色值或颜色值序列。

linewidth:柱子边缘宽度。浮点数或类数组。如果为0,不绘制柱子边缘。

tick_label:柱子的刻度标签。字符串或字符串列表。默认值为None(使用默认数值标签)。

**kwargs:Rectangle属性。通过关键字参数进一步设置柱子属性。

hatch:柱子填充符号。字符串,取值范围为 {'/', '\', '|', '-', '+', 'x', 'o', 'O', '.', '*'},符号可以组合,例如/+,多个重复符号,增加密度。

举例 

plt.subplot()
x=[]
hight=[]
width=[]
bottom=
plt.bar(x,hight,width,bottom,color='',edgecolor='',linewidth=,tick_label=[],hatch='')
plt.title('')
plt.show()

Python matplotlib绘制折线图

一、安装matplotlib(如果没有)

pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple

示例 

# coding=utf-8
import matplotlib.pyplot as plt
 
plt.figure(figsize=(20, 10), dpi=100)

x = []
y = []
plt.plot(x, y)
plt.show()
figure():创建图像并设置图像的大小等属性,返回一张图像,可传入多参数,常用两个参数。

figsize=(width, height):参数传入一个元组(width, height),设置图像的大小。

dpi=:传入一个整数值,设置图像的清晰度。

plot():绘制图的函数。可传入多参数,一般传入两个列表,分别是图中的x值和y值。

show():展示图像。

x坐标值中有中文,首次使用matplotlib绘图时中文无法正常显示。

要解决中文显示问题,可下载安装SimHei字体

SimHei免费字体下载 - 英文字体免费下载尽在字体家 (zitijia.com)

plt.plot(x, y, c='')
plt.scatter(x, y, c='')
y_ticks = range(50)
plt.yticks(y_ticks[::5])
plt.grid(True, linestyle='--', alpha=0.5)
plt.xlabel("xx", fontdict={'size': 16})
plt.ylabel("yy", fontdict={'size': 16})
plt.title("xy", fontdict={'size': 20})
plt.show()
  • plot()函数绘图可以通过c='颜色'来设置颜色。
  • scatter():绘制散点图。scatter可以单独对点进行设置,展示得更明显。
  • 折线图是用直线连接相邻的两个点形成的,但是连成折线后点的显示不明显。
  • yticks():用于设置y轴坐标的范围,传入一个可迭代对象(如range()函数)。
  • 如绘制图像的y轴坐标范围是数据的范围,坐标原点不是0,使用yticks函数可设置想要的坐标范围。同理xticks
  • grid():用于设置图表中的网格线,使用linestyle参数设置网格线的样式,
  • plot()函数,可用linestyle=参数设置线图的样式。使用alpha参数设置网格线的透明度。

linestyle参数样式linestyle参数字符
实线
虚线- - 
点划线-.
点虚线

xlabel():用于设置x轴的标签,说明x轴坐标的含义,第一个参数传入需要设置的标签值,后面可以通过其他参数设置显示的效果,如字体大小等。ylabel同理。

title():用于设置图的标题,说明图展示的数据。用法同xlabel。

plt.xlabel("xx", fontdict={'size': })
plt.ylabel("yy", fontdict={'size': })
plt.title("xy", fontdict={'size': })

legend(): 展示图例,通过loc参数传入图例在图表中展示的位置,

可以传入的值有‘best’, 'upper right', 'upper left', 'lower left', 'lower right', 'right', 'center left', 'center right', 'lower center', 'upper center', 'center',这十一个值分别对应数字0~10,

传值时也可以传对应的数字,后面十个值都指定了图例的位置,

'best'表示自适应,会自动根据图像的分布在后面的十个值中选择一个,大部分为右上角'upper right'。

plt.legend(loc='best')

matplotlib绘制多张折线图

fig, axs = plt.subplots(nrows=1, ncols=3, figsize=(20, 6), dpi=100)
subplots():在同一张图像中绘制多张图表,通过nrows, ncols两个参数设置图表的张数和排列方式;figsize=(, ), dpi=同figure()函数。

subplots()函数返回两个参数,一个是图像对象fig,一个是可迭代的图表数组axs(类型为numpy中的数组对象)。

每一张图表中的标签、标题、样式、图例等都需要单独设置,为避免代码过于冗余,使用循环。

绘制每一张图表时,从axs中取出每一张图表,再调用plot()函数绘图。

在设置坐标轴、标签、标题时,使用'set_'开头的方法进行设置,如设置x轴标签用set_xlabel()。

a = []
b = []
c = []
d = []
y_data = [a, b, c]
colors = ['red', 'green', 'blue']
line_style = ['-', '--', '-.']
y_labels = ["y1", "y2", "y3"]
for i in range(3):
    axs[i].plot(a, y_data[i], c=colors[i], label=y_labels[i], linestyle=line_style[i])
    axs[i].scatter(a, y_data[i], c=colors[i])
    axs[i].legend(loc='best')
    axs[i].set_yticks(range(0, 50, 5))
    axs[i].grid(True, linestyle='--', alpha=0.5)
    axs[i].set_xlabel("xx", fontdict={'size': 16})
    axs[i].set_ylabel(y_labels[i], fontdict={'size': 16}, rotation=0)
    axs[i].set_title("xx{}".format(y_labels[i]), fontdict={'size': 20})
fig.autofmt_xdate()
plt.show()

fig.autofmt_xdate()


autofmt_xdate(): x轴坐标值自适应倾斜。

因为一张图像中有多张图表,x坐标值靠得很近,可能会因重叠造成展示效果差,

使用fig对象的autofmt_xdate()方法可以设置自适应倾斜。

Matplotlib画热力图---heatmap(逐行注释)

import numpy as np
import matplotlib
import matplotlib.pyplot as plt

y = ["a", "b", "c", "d","e", "f", "g"]     

x = ["A", "B", "C","D", "E", "F", "G"]
           
z = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
              [2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
              [1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
              [0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
              [0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
              [1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
              [0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])

#定义热力图数据

fig, ax = plt.subplots()  #将元组分解为fig和ax两个变量 

im = ax.imshow(z)   #显示图片

ax.set_xticks(np.arange(len(x)))    #设置x轴刻度间隔

ax.set_yticks(np.arange(len(y)))    #设置y轴刻度间隔

ax.set_xticklabels(x)        #设置x轴标签'''

ax.set_yticklabels(y)     #设置y轴标签'''

plt.setp(ax.get_xticklabels(), rotation=45, ha="right",rotation_mode="anchor")

#设置标签 旋转45度 ha有三个选择:right,center,left(对齐方式)

画图

  • j,i:表示坐标值上的值
  • z[i, j]表示内容
  • ha有三个选择:right,center,left(对齐方式)
  • va有四个选择:'top', 'bottom', 'center', 'baseline'(对齐方式)
  • color:设置颜色
for i in range(len(y)):
    for j in range(len(x)):
        text = ax.text(j, i, z[i, j],
                       ha="center", va="center", color="w")

ax.set_title("")      #设置题目

fig.tight_layout()  #自动调整子图参数,使之填充整个图像区域。

plt.show()      #图像展示

从一个numpy数组和两个标签列表创建一个热图。

def heatmap(data, row_labels, col_labels, ax=None, 
            cbar_kw={}, cbarlabel="", **kwargs):

    """
     data #形状为(N,M)的2D numpy数组。

     row_labels #长度为N且带有行标签的列表或数组。

     col_labels #长度为M的列表或数组,带有列的标签。

     ax #绘制热图的`matplotlib.axes.Axes`实例。 如果未提供,请使用当前轴或创建一个新轴。 (可选的。)

     cbar_kw #带有`matplotlib.Figure.colorbar`参数的字典。 可选的。

     cbarlabel #颜色条的标签。 可选的。

     **kwargs #所有其他参数都转发给“imshow”。
    """

#如果不在ax,挪动坐标轴

if not ax:
        ax = plt.gca()

im = ax.imshow(data, **kwargs)

#画图 

#创造彩条
cbar = ax.figure.colorbar(im, ax=ax, **cbar_kw)


'''
im #一个可以映射颜色的对象
    
ax=ax #指示im得到的对象在哪里展示(整体)
'''

cbar.ax.set_ylabel(cbarlabel, rotation=-90, va="bottom")

'''
设置y轴标签
'''

  • 20
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值