一、系统字体与显示中文
1、matplotlib系统字体
(1)查询matplotlib系统所有字体
from matplotlib.font_manager import fontManager
fontManager.ttflist
2、matplotlib显示中文方法
## 方法一
from pylab import *
import matplotlib
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
mpl.rcParams['font.sans-serif'] = ['Microsoft YaHei'] ##更新字体格式
mpl.rcParams['font.size'] = 9
## 方法二
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文标签 ,SimHei代表:黑体
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
二、面向对象绘图案例
1、figure布局,axes区域规划,标题与文字标注等
(1)尽量使用matplotlib中figure,axes等面向对象的编程命令,少用pyplot api命令;
(2)绘图思路:由大到小,首先是figure对象布局;接着是axes对象规划,包括axes区域(如背景、颜色、栅格、图例),图形等;三是axis对象,包括坐标轴、刻度线、标签等;最后是文字信息,包括标题、数据标注、其他文字说明等。
import matplotlib.pyplot as plt
import random
#生成数据
x=[x for x in range(1,11)]
y1=[]
for i in range(10):y1.append(random.randint(10,40))
y2=[]
for i in range(10):y2.append(random.randint(10,40))
#显示中文
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
#图片布局
fig,(ax1,ax2)=plt.subplots(2,1,sharex=True)
fig.set_figheight(4)
fig.set_figwidth(6)
#绘制图ax1
plt.sca(ax1) #选定ax1
ax1.plot(x,y1,label='y1销售金额',c='r',ls='--',lw=2,marker='o',mec='b',ms=4)
ax1.patch.set_facecolor("gray") #设置ax1区域背景颜色
ax1.patch.set_alpha(0.5) #设置ax1区域背景颜色透明度
ax1.grid() #打开网格
ax1.legend(loc='best',fontsize=9,frameon=False) #图例设置
#ax1标题与标注
ax1.set_title("y1销售趋势图",fontsize=11) #设置标题
for xy1 in zip(x, y1): #标注数据
plt.annotate("%s" % xy1[1], xy=xy1, xytext=(-5, 5), textcoords='offset points',color='b')
#绘制图ax2
plt.sca(ax2)
ax2.patch.set_facecolor("yellowgreen")
ax2.patch.set_alpha(0.5)
ax2.plot(x,y2,label='y2销售金额',c='b',ls='--',lw=2,marker='o',mec='orange',ms=4)
ax2.legend(loc='best',fontsize=9,frameon=False)
#ax2标题与标注
ax2.set_title("y2销售趋势图",fontsize=11)
for xy2 in zip(x, y2):
plt.annotate("%s" % xy2[1], xy=xy2, xytext=(-5, 5), textcoords='offset points',color='r')
#调整字图间距离
plt.subplots_adjust(0.1,0.2)
#显示图像
plt.show()
2、axis(坐标轴)与tick(刻度)
###########第一部分:读取数据##############
import sys
sys.path.append(r"E:\python\project\python可视化\eda可视化项目\数据清洗与描述")
import data_and_clear
from datetime import datetime
df=data_and_clear.yd_department_day_sold()
#x轴转为日期格式
dates = [str(y) for y in list(df['date'])]
x_date = [datetime.strptime(d, '%Y%m%d').date() for d in dates]
###########第二部分:matplotlib绘图##############
#设置显示中文
from pylab import *
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
#显示中文
matplotlib.rcParams['font.family'] = 'Microsoft JhengHei'
mpl.rcParams['font.sans-serif'] = ['Microsoft JhengHei'] #更新字体格式
mpl.rcParams['font.style'] = 'italic'
mpl.rcParams['font.size'] = 9 #更新字体大小
#figure布局
fig=plt.figure(figsize=(8,4))
ax1=fig.add_subplot(1,1,1)
#绘图
ax1.plot(x_date,df['HC'],ls='--',lw=3,color='b',marker='o',ms=6, mec='r',mew=2, mfc='w',label='业绩趋势走向')
plt.gcf().autofmt_xdate() # 自动旋转日期标记
#配置坐标轴
#设置x轴为日期格式
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y/%m/%d'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
#去除部分边框和刻度线
ax1.spines['left'].set_color('none')
ax1.spines['right'].set_color('none')
ax1.spines['top'].set_color('none')
ax1.tick_params(labelleft=False,left=False,right=False,top=False)
ax1.tick_params(labelsize=9)
#设置坐标轴标签
plt.ylabel("销售额(万美元)",fontsize=11,color='b')
#标注数据
for xy in zip(x_date,df['HC']): #标注数据
plt.annotate("%0.02f" % round(xy[1]/10000,2), xy=xy, xytext=(2,12), textcoords='offset points',color='k',rotation=30)
#图像标题
ax1.set_title("业绩趋势走向图",fontsize=12)
#显示图像
plt.show()
3、双折线图
import matplotlib.pyplot as plt
x1=range(0,10)
y1=[10,13,5,40,30,60,70,12,55,25]
x2=range(0,10)
y2=[5,8,0,30,20,40,50,10,40,15]
plt.plot(x1,y1,label='Frist line',linewidth=3,color='r',marker='o', markerfacecolor='blue',markersize=12)
plt.plot(x2,y2,label='second line')
plt.xlabel('Plot Number')
plt.ylabel('Important var')
plt.title('Interesting Graph\nCheck it out')
plt.legend(loc='upper left')
plt.show()
三、设置折线与点属性
1、线条名称(标签)
label:给所绘制的曲线一个名字,在图示/图例中显示
plt.plot(x,y,'ro', color='r', label='业绩趋势走向')
2、线条颜色
(1)线条颜色命名方式
- 用全名,如blue
- 16进制,如FF00FF
- (r,g,b)或者(r,g,b,a),其中r,g,b,a均取值[0,1]之间。
(2)颜色名称或简写
plot方法的关键字参数color(或c)用来设置线的颜色。
plt.plot(x,y1, color='blue')
plt.plot(x, y1,c='blue')
常用取值:b:blue g:green r:red c:cyan m:magenta y:yellow k:black w:white
详细颜色参数:http://www.cnblogs.com/darkknightzh/p/6117528.html
3、线条形状
plot方法的关键字参数linestyle(或ls)用来设置线的样式。
plt.plot(x, y1, linestyle=':')
plt.plot(x, y1, ls=':')
可取值为:
- 实线(solid)
-- 短线(dashed)
-. 短点相间线(dashdot)
:虚点线(dotted)
None 空
4、线条大小
设置plot方法的关键字参数linewidth(或LW)可以改变线的粗细,其值为浮点数。
plt.plot(x,y1, c='r', ls='--', lw=3)
5、折点样式
(1)marker -- 折点形状
(2)markeredgecolor 或 mec -- 折点外边颜色
(3)markeredgewidth 或 mew -- 折点线宽
(4)markerfacecolor 或 mfc -- 折点实心颜色
(5)markerfacecoloralt 或 mfcalt
(6)markersize 或ms -- 折点大小
折点形状选择:
'-'
solid line style
'--'
dashed line style
'-.'
dash-dot line style
':'
dotted line style
'.'
point marker
','
pixel marker
'o'
circle marker
'v'
triangle_down marker
'^'
triangle_up marker
'<'
triangle_left marker
'>'
triangle_right marker
'1'
tri_down marker
'2'
tri_up marker
'3'
tri_left marker
'4'
tri_right marker
's'
square marker
'p'
pentagon marker
'*'
star marker
'h'
hexagon1 marker
'H'
hexagon2 marker
'+'
plus marker
'x'
x marker
'D'
diamond marker
'd'
thin_diamond marker
'|'
vline marker
'_'
hline marker
plt.plot(x, y1, marker='o', mec='r', mfc='w')
plt.plot(x, y2, marker='*', ms=10)
6、alpha线条透明度
alpha的值在[0,1]之间
import matplotlib.pyplot as plt
y1=[12,3,6,7,23,19,16]
y2=[14,9,12,17,13,11,15]
x=[1,2,3,4,5,6,7]
plt.plot(x,y1,ls='--',lw=4,c='b',alpha=0.5,label='total')
plt.plot(x,y2,ls='-.',lw=4,c='g',alpha=0.8,label='quantity')
plt.legend()
plt.show()
四、设置图例语法legend
1、图例legend基础语法及用法
matplotlib.pyplot.legend(*args, **kwargs)
Keyword | Description |
---|---|
loc | Location code string, or tuple (see below). 图例所有figure位置 |
prop | the font property 字体参数 |
fontsize | the font size (used only if prop is not specified) |
markerscale | the relative size of legend markers vs. original 图例标记与原始标记的相对大小 |
markerfirst | If True (default), marker is to left of the label. 如果为True,则图例标记位于图例标签的左侧 |
numpoints | the number of points in the legend for line. 为线条图图例条目创建的标记点数 |
scatterpoints | the number of points in the legend for scatter plot. 为散点图图例条目创建的标记点数 |
scatteryoffsets | a list of yoffsets for scatter symbols in legend. 为散点图图例条目创建的标记的垂直偏移量 |
frameon | If True, draw the legend on a patch (frame). 控制是否应在图例周围绘制框架 |
fancybox | If True, draw the frame with a round fancybox. 控制是否应在构成图例背景的FancyBboxPatch周围启用圆边 |
shadow | If True, draw a shadow behind legend. 控制是否在图例后面画一个阴影 |
framealpha | Transparency of the frame. 控制图例框架的 Alpha 透明度 |
edgecolor | Frame edgecolor. |
facecolor | Frame facecolor. |
ncol | number of columns 设置图例分为n列展示 |
borderpad | the fractional whitespace inside the legend border 图例边框的内边距 |
labelspacing | the vertical space between the legend entries 图例条目之间的垂直间距 |
handlelength | the length of the legend handles 图例句柄的长度 |
handleheight | the height of the legend handles 图例句柄的高度 |
handletextpad | the pad between the axes and legend border 轴与图例边框之间的距离 |
columnspacing | the spacing between columns 列间距 |
title | the legend title |
bbox_to_anchor | the bbox that the legend will be anchored.指定图例在轴的位置 |
bbox_transform | the transform for the bbox. transAxes if None. |
(1)设置图例位置
使用loc参数
plt.legend(loc='lower left')
0: ‘best' 1: ‘upper right' 2: ‘upper left' 3: ‘lower left' |
4: ‘lower right' 5: ‘right' 6: ‘center left' |
7: ‘center right' 8: ‘lower center' 9: ‘upper center' 10: ‘center' |
(2)设置图例字体
设置字体大小
fontsize:int or float or {‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, ‘x-large’, ‘xx-large’}
(3)设置图例边框及背景
plt.legend(loc='best', frameon=False) # 去掉图例边框
plt.legend(loc='best', edgecolor='blue') # 设置图例边框颜色
plt.legend(loc='best', facecolor='blue') # 设置图例背景颜色,若无边框,参数无效
(4)设置图例标题
plt.legend(loc='best', title='figure 1 legend')
2、legend面向对象命令
(1)获取并设置legend图例
plt.legend(loc=0, numpoints=1)
leg = plt.gca().get_legend() # 或 leg=ax.get_legend()
ltext=leg.get_texts()
plt.setp(ltext, fontsize=12,fontweight='bold')
(2)设置图例
legend=ax.legend((rectsTest1, rectsTest2, rectsTest3), ('test1', 'test2', 'test3'))
legend=ax.legend(loc='upper center', shadow=True, fontsize='x-large')
legend.get_frame().set_facecolor('red') # 设置图例背景为红色
frame=legend.get_frame()
frame.set_alpha(1)
frame.set_facecolor('none') # 设置图例背景透明
(3)移除图例
ax1.legend_.remove() ##移除子图ax1中的图例
ax2.legend_.remove() ##移除子图ax2中的图例
ax3.legend_.remove() ##移除子图ax3中的图例
(4)设置图例到图形边界外
#主要是bbox_to_anchor的使用
box = ax1.get_position()
ax1.set_position([box.x0, box.y0, box.width , box.height* 0.8])
ax1.legend(loc='center', bbox_to_anchor=(0.5, 1.2),ncol=3)
3、案例:显示多图例legend
import matplotlib.pyplot as plt
import numpy as np
x = np.random.uniform(-1, 1, 4)
y = np.random.uniform(-1, 1, 4)
p1, = plt.plot([1,2,3])
p2, = plt.plot([3,2,1])
l1 = plt.legend([p2, p1], ["line 2", "line 1"], loc='upper left')
p3 = plt.scatter(x[0:2], y[0:2], marker = 'D', color='r')
p4 = plt.scatter(x[2:], y[2:], marker = 'D', color='g')
# This removes l1 from the axes.
plt.legend([p3, p4], ['label', 'label1'], loc='lower right', scatterpoints=1)
# Add l1 as a separate artist to the axes
plt.gca().add_artist(l1)
import matplotlib.pyplot as plt
line1, = plt.plot([1,2,3], label="Line 1", linestyle='--')
line2, = plt.plot([3,2,1], label="Line 2", linewidth=4)
# 为第一个线条创建图例
first_legend = plt.legend(handles=[line1], loc=1)
# 手动将图例添加到当前轴域
ax = plt.gca().add_artist(first_legend)
# 为第二个线条创建另一个图例
plt.legend(handles=[line2], loc=4)
plt.show()
五、设置网格线
1、设置网格线
(1)使用pyplot api格式
打开网格线:plt.grid(true)
设置网格格式:plt.grid(color='r', linestyle='--', linewidth=1,alpha=0.3)
(2)使用axes类面向对象命令
# 同时设置两坐标轴上的网格线
ax.grid(color='r', linestyle='--', linewidth=1, alpha=0.3)
# 设置X坐标轴上(垂直方向)的网格线
ax.xaxis.grid(color='r', linestyle='--', linewidth=1, alpha=0.3)
# 设置Y坐标轴上(水平方向)的网格线
ax.yaxis.grid(color='r', linestyle='--', linewidth=1, alpha=0.3)
2、设置axes脊柱(坐标系)
(1)去掉脊柱(坐标系)
ax.spines['top'].set_visible(False) # 去掉上边框
ax.spines['bottom'].set_visible(False) # 去掉下边框
ax.spines['left'].set_visible(False) # 去掉左边框
ax.spines['right'].set_visible(False) # 去掉右边框
(2)移动脊柱
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',0))
(3)设置边框线颜色
ax=plt.gca() # 获取当前的axes
ax.spines['right'].set_color('blue')
ax.spines['top'].set_color('none')
(4)设置边框线宽
ax1.spines['left'].set_linewidth(5)
(5)设置边框线型
ax.spines['left'].set_linestyle('--')
3、设置背景颜色
(1)设置figure背景颜色
facecolor:背景颜色 edgecolor:边框颜色
# 方法1:
plt.figure(facecolor='blue', edgecolor='black')
# 方法2:
fig=plt.gcf()
fig.set_facecolor('green')
(2)设置axes背景颜色
a=plt.axes([.65, .6, .2, .2], facecolor='k') ## pyplot api命令-黑色背景
ax1=plt.gca()
ax1.patch.set_facecolor('gray') # 设置ax1区域背景颜色
ax1.patch.set_alpha(0.5) # 设置ax1区域背景颜色透明度
(3)修改matplotlib默认参数
plt.rcParams['axes.facecolor']='red'
plt.rcParams['savefig.facecolor']='red'
六、坐标轴数值格式
1、横坐标设置时间格式
from datetime import datetime
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
# 生成横纵坐标信息
dates = ['01/02/1991', '01/03/1991', '01/04/1991']
xs = [datetime.strptime(d, '%m/%d/%Y').date() for d in dates]
ys = range(len(xs))
# 配置横坐标
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
# Plot
plt.plot(xs, ys)
plt.gcf().autofmt_xdate() # 自动旋转日期标记
plt.show()
2、纵坐标设置显示百分比
import matplotlib.ticker as mtick
fmt='%.2f%%'
yticks = mtick.FormatStrFormatter(fmt)
ax2.yaxis.set_major_formatter(yticks)
3、去除科学计数法
ax.get_xaxis().get_major_formatter().set_useOffset(False)
网友评论