matplotlib点线 坐标刻度 3D图绘制(六)
plot语句中支持除X,Y以外的参数,以字符串形式存在,来控制颜色、线型、点型等要素,语法形式为:
plt.plot(X, Y, 'format', ...)
1 点和线的样式
颜色
参数color或c
五种定义颜色值的方式
别名
color='r'
合法的HTML颜色名
color = 'red'
HTML十六进制字符串
color = '#eeefff'
归一化到[0, 1]的RGB元组
color = (0.3, 0.3, 0.4)
灰度
color = (0.1)
透明度
# 透明度
y = np.arange(1, 3)
plt.plot(y, c="red", alpha=0.1); # 设置透明度
plt.plot(y+1, c="red", alpha=0.5);
plt.plot(y+2, c="red", alpha=0.9);
背景色
设置背景色,通过plt.subplot()方法传入facecolor参数,来设置坐标轴的背景色
plt.subplot(facecolor='cyan');
plt.plot(np.random.randn(10),np.arange(1,11))
线型
-
线型
线条风格 描述 线条风格 描述 ' - ' 实线 ' : ' 虚线 ' -- ' 破折线 'steps' 阶梯线 ' -. ' 点划线 '' 没有 -
点型
y = np.arange(1, 3, 0.2) plt.plot(y, '1', y+0.5, '2', y+1, '3', y+1.5,'4'); plt.plot(y+2, '3') #不声明marker,默认ls = None plt.plot(y+2.5,marker = '3') #声明了marker,ls 默认是实线 plt.show()
-
多参数连用
#颜色、点型、线型 x = np.linspace(0, 5, 10) plt.plot(x,3*x,'r-.') plt.plot(x, x**2, 'b^:') # blue line with dots plt.plot(x, x**3, 'go-.') # green dashed line plt.show()
-
点线的设置
参数 描述 参数 描述 color或c 线的颜色 linestyle或ls 线型 linewidth或lw 线宽 marker 点型 markeredgecolor 点边缘的颜色 markeredgewidth 点边缘宽度 makerfacecolor 点内部的颜色 markersize 点大小
三种设置方式
对实例使用一系列的setter方法
x = np.arange(0,10)
y = np.random.randint(10,30,size = 10)
line,= plt.plot(x, y)
line2 = plt.plot(x,y*2,x,y*3)
line.set_linewidth(5)
line2[1].set_marker('o')
print(line,line2)
使用setp()方法
line = plt.plot(x, y)
plt.setp(line, 'linewidth', 1.5,'color','r','marker','o','linestyle','--')
2 坐标轴刻度
- xticks()和yticks()方法
x = [5, 3, 7, 2, 4, 1]
plt.plot(x);
plt.xticks(range(len(x)), ['a', 'b', 'c', 'd', 'e', 'f']); # 传入位置和标签参数,以修改坐标轴刻度
plt.yticks(range(1, 8, 2));
plt.show()
- 面向对象方法
set_xticks、set_yticks、set_xticklabels、set_yticklabels方法
fig = plt.figure(figsize=(10, 4))
ax = fig.add_subplot(111)
x = np.linspace(0, 5, 100)
ax.plot(x, x**2, x, x**3, lw=2)
ax.set_xticks([1, 2, 3, 4, 5])
ax.set_xticklabels(['a','b','c','d','e'], fontsize=18)
yticks = [0, 50, 100, 150]
ax.set_yticks(yticks)
ax.set_yticklabels([y for y in yticks], fontsize=18); # use LaTeX formatted labels
- 正弦余弦:LaTex语法,用\(\pi\)等表达式在图表上写上希腊字母
x = np.arange(-np.pi,np.pi,0.01)
plt.figure(figsize=(12,9))
plt.plot(x,np.sin(x),x,np.cos(x))
plt.axis([x.min()-1,x.max()+1,-1.2,1.2])
#xticks:参数一刻度,参数二,对应刻度上的值
plt.xticks(np.arange(-np.pi,np.pi+1,np.pi/2),
['$-\delta$','$-\pi$/2','0','$\pi$/2','$\pi$'],size = 20)
plt.yticks([-1,0,1],['min','0','max'],size = 20)
plt.show()
3 直方图 条形图 饼图 散点图
-
直方图 【直方图的参数只有一个x!!!不像条形图需要传入x,y】
hist()
的参数
bins
可以是一个bin数量的整数值,也可以是表示bin的一个序列。默认值为10
normed
如果值为True,直方图的值将进行归一化处理,形成概率密度,默认值为False
color
指定直方图的颜色。可以是单一颜色值或颜色的序列。如果指定了多个数据集合,颜色序列将会设置为相同的顺序。如果未指定,将会使用一个默认的线条颜色
orientation
通过设置orientation
为horizontal 横向
创建水平直方图。默认值为vertical 纵向
x = np.random.randint(5,size = 5) display(x) plt.hist(x,histtype = 'bar');
-
正态分布
u = 100 #数学期望 s = 15 #方差 x = np.random.normal(u,s,1000) # 生成正太分布数据 ax = plt.gca() #获取当前图表 ax.set_xlabel('Value') ax.set_ylabel('Frequency') #设置x,y轴标题 ax.set_title("Histogram normal u = 100 s = 15") #设置图表标题 ax.hist(x,bins = 100,color = 'r',orientation='horizontal') plt.show()
-
条形图
bar() 方法 : 第一个参数为条形左下角的x轴坐标,第二个参数为条形的高度;
matplotlib会自动设置条形的宽度,本例中条形宽0.8plt.bar([1, 2, 3], [3, 2, 5]); plt.show()
# 例子:绘制并列条形图 data1 = 10*np.random.rand(5) data2 = 10*np.random.rand(5) data3 = 10*np.random.rand(5) locs = np.arange(1, len(data1)+1) width = 0.27 plt.bar(locs, data1, width=width); plt.bar(locs+width, data2, width=width, color='red'); plt.bar(locs+2*width, data3, width=width, color='green') ; plt.xticks(locs + width*1, locs); plt.show()
barh方法
plt.barh([1, 2, 3], [3, 2, 5],height = 0.27,color = 'cyan'); plt.show()
-
饼状图
饼图:【饼图也只有一个参数x!】
pie()
饼图适合展示各部分占总体的比例,条形图适合比较各部分的大小常规的饼图绘制
plt.figure(figsize = (4,4)) # 饼图绘制正方形 x = [45,35,20] #百分比 labels = ['Cats','Dogs','Fishes'] #每个区域名称 plt.pie(x,labels = labels) plt.show()
部分饼图的绘制
plt.figure(figsize=(4, 4)); x = [0.1, 0.2, 0.3] # 当各部分之和小于1时,则不计算各部分占总体的比例,饼的大小是数值和1之比 labels = ['Cats', 'Dogs', 'Fishes'] plt.pie(x, labels=labels); # labels参数可以设置各区域标签 plt.show()
切分的饼图
# labels参数设置每一块的标签;labeldistance参数设置标签距离圆心的距离(比例值) # autopct参数设置比例值的显示格式(%1.1f%%);pctdistance参数设置比例值文字距离圆心的距离 # explode参数设置每一块顶点距圆形的长度(比例值);colors参数设置每一块的颜色; # shadow参数为布尔值,设置是否绘制阴影 plt.figure(figsize=(4, 4)); x = [4, 9, 21, 55, 30, 18] labels = ['Swiss', 'Austria', 'Spain', 'Italy', 'France', 'Benelux'] explode = [0.2, 0.1, 0, 0, 0.1, 0] colors = ['r', 'k', 'b', 'm', 'c', 'g'] plt.pie(x, labels=labels, labeldistance=1.2, explode=explode, colors=colors, autopct='%1.1f%%', pctdistance=0.5, shadow=True); plt.show()
-
散点图
散点图 : 【散点图需要两个参数x,y,但此时x不是表示x轴的刻度,而是每个点的横坐标!】
scatter()
# s参数设置散点的大小;c参数设置散点的颜色;marker参数设置散点的形状 x = np.random.randn(1000) y = np.random.randn(1000) size = 50*abs(np.random.randn(1000)) colors = np.random.randint(16777215,size = 1000) li = [] for color in colors: a = hex(color) str1 = a[2:] l = len(str1) for i in range(1,7-l): str1 = '0'+str1 str1 = "#" + str1 li.append(str1) plt.scatter(x, y,s = size, c=li, marker='d'); plt.show()
复杂的饼图的绘制
import numpy as np import pandas as pd from pandas import Series,DataFrame import matplotlib.pyplot as plt x = np.random.randn(1000) y1 = np.random.randn(1000) y2 = 1.2 + np.exp(x) #exp(x) 返回的是e的x次方 ax1 = plt.subplot(121) plt.scatter(x,y1,color = 'purple',alpha = 0.3,edgecolors = 'white',label = 'no correl') plt.xlabel('no correlation') plt.grid(True) plt.legend() ax2 = plt.subplot(122) plt.scatter(x,y2,color = 'green',alpha = 0.3,edgecolors = 'gray',label = 'correl') plt.xlabel('correlation') plt.grid(True) plt.legend() plt.show()
-
图形的文字,注释,箭头
pyplot函数 API方法 描述 text() mpl.axes.Axes.text() 在Axes对象中任意位置添加文字 xlabel mpl.axes.Axes.set_xlabel() 为X轴添加标签 ylabel mpl.axes.Axes.set_ylabel() 为y轴添加标签 title() mpl.axes.Axes.set_title() 为Axes对象添加标题 legend() mpl.axes.Axes.legend() 为Axes对象添加图例 figtext() mpl.figure.Figure.text() 在Figure对象中任意位置添加文字 suptitle() mpl.figure.Figure.suptitle() 在Figure对象中添加中心化标题 annnotate mpl.axes.Axes.annnotate() 在Axes对象添加注释(箭头) 注释
# xy参数设置箭头指示的位置,xytext参数设置注释文字的位置 # arrowprops参数以字典的形式设置箭头的样式 # width参数设置箭头长方形部分的宽度,headlength参数设置箭头尖端的长度, # headwidth参数设置箭头尖端底部的宽度,shrink参数设置箭头顶点、尾部与指示点、注释文字的距离(比例值) y = [13, 11, 13, 12, 13, 10, 30, 12, 11, 13, 12, 12, 12, 11, 12] plt.plot(y); plt.ylim(ymax=35); # 为了让注释不会超出图的范围,需要调整y坐标轴的界限 plt.annotate('this spot must really\nmean something', xy=(6, 30), xytext=(8, 31.5), arrowprops=dict(width=15, headlength=20, headwidth=20, facecolor='black', shrink=0.1)); plt.show()
# 生成3个正态分布数据数据集 x1 = np.random.normal(30, 3, 100) x2 = np.random.normal(20, 2, 100) x3 = np.random.normal(10, 3, 100) # 绘制3个数据集,并为每个plot指定一个字符串标签 plt.plot(x1, label='plot') # 如果不想在图例中显示标签,可以将标签设置为_nolegend_ plt.plot(x2, label='2nd plot') plt.plot(x3, label='last plot') # 绘制图例 plt.legend(bbox_to_anchor=(0, 1.02, 1, 0.102), # 指定边界框起始位置为(0, 1.02),并设置宽度为1,高度为0.102 ncol=3, # 设置列数为3,默认值为1 mode="expand", # mode为None或者expand,当为expand时,图例框会扩展至整个坐标轴区域 borderaxespad=0.) # 指定坐标轴和图例边界之间的间距 # 绘制注解 plt.annotate("Important value", # 注解文本的内容 xy=(55,20), # 箭头终点所在位置 xytext=(5, 38), # 注解文本的起始位置,箭头由xytext指向xy坐标位置 arrowprops=dict(arrowstyle='->')); # arrowprops字典定义箭头属性,此处用arrowstyle
箭头
plt.figure(figsize=(12,9)) plt.axis([0, 10, 0, 20]); arrstyles = ['-', '->', '-[', '<-', '<->', 'fancy', 'simple', 'wedge'] for i, style in enumerate(arrstyles): plt.annotate(style, xytext=(1, 2+2*i), xy=(4, 1+2*i), arrowprops=dict(arrowstyle=style)); connstyles=["arc", "arc,angleA=10,armA=30,rad=30", "arc3,rad=.2", "arc3,rad=-.2", "angle", "angle3"] for i, style in enumerate(connstyles): plt.annotate(style, xytext=(6, 2+2*i), xy=(8, 1+2*i), arrowprops=dict(arrowstyle='->', connectionstyle=style)); plt.show()
-
3D图形绘制
import numpy as np import matplotlib.pyplot as plt #3d图形必须的 from mpl_toolkits.mplot3d.axes3d import Axes3D %matplotlib inline #系数,由X,Y生成Z a = 0.7 b = np.pi #计算Z轴的值 def mk_Z(X, Y): return 2 + a - 2 * np.cos(X) * np.cos(Y) - a * np.cos(b - 2*X) #生成X,Y,Z x = np.linspace(0, 2*np.pi, 100) y = np.linspace(0, 2*np.pi, 100) X,Y = np.meshgrid(x, y) Z = mk_Z(X, Y) fig = plt.figure(figsize=(14,6)) #创建3d的视图,使用属性projection ax = fig.add_subplot(1, 2, 1, projection='3d') ax.plot_surface(X,Y,Z,rstride = 5,cstride = 5) #创建3d视图,使用colorbar,添加颜色柱 ax = fig.add_subplot(1, 2, 2, projection='3d') p = ax.plot_surface(X, Y, Z, rstride=5, cstride=5, cmap='rainbow', antialiased=True) cb = fig.colorbar(p, shrink=0.5)
-
玫瑰图绘制
极坐标条形图
#极坐标条形图 def showRose(values,title): max_value = values.max() # 分为8个面元 N = 8 # 面元的分隔角度 angle = np.arange(0.,2 * np.pi, 2 * np.pi / N) # 每个面元的大小(半径) radius = np.array(values) # 设置极坐标条形图 plt.axes([0, 0, 2, 2], polar=True,facecolor = 'g') colors = [(1 - x/max_value, 1 - x/max_value, 0.75) for x in radius] # 画图 plt.bar(angle, radius, width=(2*np.pi/N), bottom=0.0, color=colors) plt.title(title,x=0.2, fontsize=20) #拉韦纳(Ravenna)又译“腊万纳”“拉文纳”“拉温拿”。意大利北部城市。位于距亚得里亚海10公里的沿海平原上 data = np.load('Ravenna_wind.npy') hist, angle = np.histogram(data,8,[0,360]) showRose(hist,'Ravenna')