使用matplotlib包画水平柱状图时出现中文乱码

在window下进行画图时,出现遇到中文就是方框的情况,发现是使用matplotlib包时出现的,这种情况很常见。

可以通过matplot的rcParams属性来设置

mpl.rcParams['font.sans-serif'] = ['SimHei']  #设置中文字体
mpl.rcParams['axes.unicode_minus'] = False

比如用matplot包画个水平柱状风险图

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import os,sys
import matplotlib as mpl

mpl.rcParams['font.sans-serif'] = ['SimHei']  #设置中文字体
mpl.rcParams['axes.unicode_minus'] = False

def barhPlot(dataLst, labels, prefix='bar_out', outdir='./'):

	fig, ax = plt.subplots(figsize=(9, 6), frameon=True)

	ypos = np.arange(len(dataLst))

	colors = [ 'red' if data > 3.2 else ('orange' if data > 2.5 else ('yellow' if data > 1.5 else 'green'))for data in dataLst ]

	ax.barh(ypos, dataLst, 0.8, align='center', color=colors, edgecolor=colors, alpha=0.5)

	ax.set_yticks(ypos)

	ax.set_yticklabels(labels, fontsize=18, fontweight='bold')

	ax.set_xlim([0, 4.5])

	plt.axvline(x=1.5, color='green', linestyle='--')

	plt.axvline(x=2.5, color='orange', linestyle='--')

	plt.axvline(x=3.2, color='red', linestyle='--')

	ax.set_xticklabels(['0', '0.5', '1.0', '1.5', '2.0', '2.5', '3.0', '3.5', '>4.0'], fontsize=16)

	ax.invert_yaxis()

	ax.tick_params(top='off', right='off')

	plt.tight_layout()

	plt.savefig(os.path.join(outdir, prefix + '.png'), format='png', dpi=300)

	plt.clf()

	plt.close()



keyLabels = [u'癌症1',u'癌症2',u'癌症3',u'癌症4',u'癌症5',u'癌症6',u'癌症7']

OR = [0.92,2.246,1.631,2.051,1.017,1.006,1.005]

barhPlot(OR,keyLabels)

import numpy as np
import matplotlib.pyplot as plt
import os,sys
import matplotlib as mpl

% matplotlib inline

mpl.rcParams['font.sans-serif'] = ['SimHei']  #设置中文字体
mpl.rcParams['axes.unicode_minus'] = False

outdir ='C:/Users/user/Desktop/'
prefix='cancer_bar_out'

#数据
x_data = [u'肺癌',u'胃癌',u'结直肠癌',u'肝癌',u'鼻咽癌',u'食管癌',u'甲状腺癌',u'口腔和咽喉癌',u'前列腺癌',u'膀胱癌',u'睾丸癌',u'胰腺癌',u'肾癌',u'黑色素瘤',u'头颈部鳞状癌',u'脑膜瘤',u'神经胶质瘤',u'胆囊癌',u'慢性淋巴细胞白血病',u'皮肤癌',u'乳腺癌']
y_data = [2.42,5.35,1.00,1.12,1.64,1.34,1.00,0.56,1.52,2.81,0.15,1.00,1.00,1.00,1.45,1.00,1.00,1.50,1.02,1.04,1.23]
bar_width=0.8
colors = [ 'red' if data > 3.2 else ('orange' if data > 2.5 else ('yellow' if data > 1.5 else 'green'))for data in y_data ]
#y轴
fig, ax = plt.subplots(figsize=(9, 6), frameon=False)
ypos = np.arange(len(x_data))
ax.barh(ypos, width=y_data,color=colors, alpha=1.0, height=bar_width)
ax.set_yticks(ypos)
ax.set_yticklabels(x_data, fontsize=10, fontweight='bold')
for y, x in enumerate(y_data):
    plt.text(x+0.5, y-bar_width/2, '%s' % x, ha='center', va='bottom')
    
# 设置标题
plt.title(u'癌症风险图')
# 为两条坐标轴设置名称
plt.xlabel(u'风险值')
plt.ylabel(u'癌种')
plt.savefig(os.path.join(outdir, prefix + '.png'), format='png', dpi=300)  #放在show后面,图片为空白
plt.show()

猜你喜欢

转载自blog.csdn.net/Cassiel60/article/details/89225437
今日推荐