matplotlib画图-折线/散点/柱状/条形图

  • Post author:
  • Post category:其他




1 折线图

【绘图】:
plt.plot(x,y):x,y的位置

绘制两个折线,并设置不同样式:
plt.plot([位置1],1,'样式1', [位置2],2,'样式2')
或者,重复:
plt.plot(x,y1)
plt.plot(x,y2)

【参数】:
plt.plot(
	位置序列, 		位置序列可以省略,默认为0,1,2...
	数据序列, 
	marker, 		数据标记,默认圆形
	linstyle, 		线性,默认实线
	color, 			颜色
	style,			颜色标记线型可简写,与marker linstyle color不相容,顺序不可变
	markersize, 	标记大小
	linewidth,		线宽
	drawstyle=''	设置非实际数据点的插值方式,默认线性插值(直接
					连),'steps=post'为阶梯式
	label,			该条线标签,与plt.legend()同时使用,传入'nolegend'表示除去该图例
	)


【颜色、标记、线形】
1 marker
常见数据标记:
o:圆形   s 方形   p 五角星				v '1'     <  '3'
D 菱形   d 菱形   h 六角形 				^ '2'     >  '4'
* 星型   + 加号   x x型  H 六角形        .

2 linstyle
- 直线	-- 虚线		-. -. 		: 细小虚线

3 color
c-青色  g-绿  y:黄色  m-品红  b-蓝色  k:黑色  w:白色

4 颜色、标记、线型的简单表示:
plt.plot(位置序列,数据序列,'bo-')  带蓝色圆点的直线,顺序:颜色、标记、线形
'g^' 绿色^标记的散点图		'r--'红色虚线折线图



日期数据较多,x轴标签显示重叠

plt.plot_date(x,y,xdate=,ydate=)
可绘制折线图和散点图,柱形图如果x轴的标签显示重叠可以变为条形图
d = pd.DataFrame(np.random.rand(100)+np.random.randint(20,80,100), index=pd.period_range('1980-01',freq='M',periods=100),columns=[u'降雨量']).reset_index()
d.rename(columns={'index':u'时间'}, inplace=True)
d.head()
	时间	降雨量
0	1980-01	56.414361
1	1980-02	42.404928
2	1980-03	68.200190
3	1980-04	23.079409
4	1980-05	38.859220

plt.figure(figsize=(10,4))
plt.plot_date(d['时间'],d['降雨量'],'b-',xdate=True,alpha=0.8,linewidth=0.5)
plt.ylabel(u'降雨量')
plt.xticks(rotation=20)
plt.show()

在这里插入图片描述



2 绘制散点图

plt.scatter(
	x_values, y_values, 		值
	s, 							点的大小
	c=字符串/映射关联列,			颜色,颜色字符串或关联列,此时表示颜色映射的索引位置
	cmap=plt.cm.Blues, 			颜色映射类型,或简写cmap='Blues',但必须设置c的顺序数
	marker, 					点类型
	edgecolor					点的轮廓颜色,'none'可将轮廓删除
)

显示两组,并设置不同组的样式:
plt.scatter(x1, x2, marker='h', s=1, c='k')
plt.scatter(x1, x3, marker='s', s=1, c='r')

根据值的大小设置大小:
plt.scatter(x1, x2, s=x2):大小为x2大小,或x2*0.1如果值太大



颜色条

a = [np.random.randint(0,5)]  # 初始设定的值
for i in range(499):  # 500次随机漫步
    a = np.append(a,a[-1]+np.random.choice([-1,1]))
    
plt.figure(figsize=(6,4))
s = np.random.randint(1,50,500)
plt.scatter(
    range(500),a,
    s=s,c=s, cmap=plt.cm.cool, alpha=0.8, edgecolor='white'
)
plt.colorbar()

在这里插入图片描述



3 柱状/条形图

【柱状图】
plt.bar(left, height, width=0.8, bottom=None, hold=None, data=None, **kwargs)

left 			每一条的顺序值,左下角位置
height 			每一条的具体值
width  			条的宽度
bottom 			可以为条形图的每个条形添加基准线,默认为0
color			填充颜色
edgecolor 		边缘颜色
linewidth 		边缘宽度
alpha 			设置柱状填充颜色的透明度 大于0 小于等于1
tick_label 		刻度标签
label 			图例
xerr/yerr		单个数或序列   显示误差棒,横向条形图/纵向条形图
align 			{‘center’, ‘edge’}对齐方式,设置plt.xticks()函数中的标签的位置
orientation     设置条形图的摆放方向,默认为垂直方向{‘vertical’, ‘horizontal’}
log             是否需要对绘图数据进行log变换

【条形图】
plt.barh(位置, 长度, orientation='horizontal')

【分离式条形图】
plt.broken_barh(xranges , yranges , facecolors, label):绘制一个条

xranges:该条位置x范围(xmin,xwidth)注意是长度不是最大值
yranges:该条位置y范围(ymin,ywidth)
facecolors:
label


1 分组柱状图

a = [12,24,35,43,56,57,30,20]
b = [10,25,38,45,54,60,24,17]
plt.figure(figsize=(6,4))
width = 0.3
plt.bar(np.array(range(8))-width/2, a,color='red',alpha=0.5,label=u'男',width=width)
plt.bar(np.array(range(8))+width/2, b,color='blue',alpha=0.3, label=u'女',width=width)
# 加数据标签(标签位置以其左边为准)
for i, v in enumerate(a):
    plt.annotate(v, (i-width, v+0.2))
for i, v in enumerate(b):
    plt.annotate(v, (i, v+0.2))
# 加轴刻度标签
plt.xticks(range(8), [u'18岁以下','18-25','26-30','31-40','41-50','51-60','61-70',u'71及以上'])
plt.title(u'xx国xx年人口年龄分布')
plt.ylabel(u'万人', rotation='horizontal',y=1)
plt.legend()

在这里插入图片描述


2 堆积条形图

data = np.array(
    [[60,30,5,5],
    [59,32,6,3],
    [58,32,7,3],
    [56,30,8,6],
    [54,29,10,7],
     [52,28,13,7],
     [51,28,15,6],
     [50,26,18,6],
    ]
)
fig = plt.figure(figsize=(6,4))

for i,c,label in zip(range(len(data)), [ 'blue','teal', 'navy', 'purple'], ['煤', '石油', '天然气', '其它']):
    plt.bar(range(data.shape[0]), data[:,i], width=0.5,
            bottom=np.sum(data[:,:i], axis=1),  # axis=1计算每行和,累计
            color=c, alpha=0.5, label=label
           )
plt.xlabel(u'年份', fontsize=10)
plt.ylabel(u'消耗比例(%)', fontsize=10)
plt.xticks(range(len(data)), [2010,2011,2012,2013,2014,2015,2016,2017], fontsize=10)

plt.plot(range(len(data)), data[:,0],label=u'煤消耗比例',color='black')
plt.legend(loc='upper right')

在这里插入图片描述


3 条形图

data = np.array(
    [[60,30,5,5],
    [59,32,6,3],
    [58,32,7,3],
    [56,30,8,6],
    [54,29,10,7],
     [52,28,13,7],
     [51,28,15,6],
     [50,26,18,6],
    ]
)
fig = plt.figure(figsize=(6,4))
for i,c,label in zip(range(len(data)), [ 'black','teal', 'navy', 'purple'], ['煤', '石油', '天然气', '其它']):
    plt.barh(range(data.shape[0]), data[:,i],
            left=np.sum(data[:,:i], axis=1),  # axis=1计算每行和,累计
            color=c, alpha=0.5, label=label,orientation='horizontal',
           )
plt.ylabel(u'年份', fontsize=10,rotation='horizontal',y=0)
plt.xlabel(u'消耗比例(%)', fontsize=10,loc='right')
plt.yticks(range(len(data)), [2010,2011,2012,2013,2014,2015,2016,2017], fontsize=10)
plt.legend(bbox_to_anchor=(1,1))

plt.savefig(r'C:\Users\aa\Desktop\b.png',dpi=300,bbox_inches='tight')  # 保存全部的图片

在这里插入图片描述


4 分离式条形图

fig, ax = plt.subplots()
ax.broken_barh([(1, 45), (55, 45), (120, 45), (175, 45)], (5, 10), facecolors='blue')
ax.broken_barh([(45, 10), (100, 20), (165, 10)], (25,10), facecolors=('green', 'orange', 'red'))
ax.set_xlim(0, 250)
ax.set_ylim(0, 40)
ax.set_yticks([10, 30])
ax.set_yticklabels(['class', 'break'])
ax.set_xticks([1, 45, 55, 100, 120, 165, 175, 220])
ax.set_xticklabels(['8:00','8:45','8:55','9:40','10:00','10:45','10:55','11:40'],rotation=40)
ax.set_xlabel('time'),
ax.grid(True, axis='x')
 # 添加文字注释
ax.annotate('first break', (40, 30), (40, 36))
ax.annotate('second break', (90, 30), (90, 36))
ax.annotate('third break', (165, 30), (165, 36))
ax.annotate('English', (25, 10), (25, 3))
ax.annotate('Math', (80, 10), (80, 3))
ax.annotate('Music', (130, 10), (130, 3))
ax.annotate('PE', (200, 10), (200, 3))
 # 带箭头注释
ax.annotate('longer break', (120, 30), (150, 20),
            arrowprops=dict(facecolor='black', shrink=0.2),
            fontsize=12)
plt.title(u'课程时间表', fontsize=18)
plt.show()

在这里插入图片描述



版权声明:本文为weixin_45167920原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。