本笔记参考:
matplotlib Plotting Cookbook by Alexandre Devert
Plot types — Matplotlib 3.9.3 documentation
(尝试记录并不断完善matplotlib的使用方法笔记,为后面使用提供参考。)
颜色
Matplotlib支持使用各种颜色和 colormap 来可视化信息。下面是一些常见的定义颜色方式.
- RGB或RGBA(红、绿、蓝、透明度)在闭区间[0, 1]内的浮点数元组。
- 不区分大小写的十六进制RGB或RGBA字符串。
- 表示灰度值的浮点数在闭区间 [0, 1] 内的字符串形式。
- 某些基本颜色的单字符简写表示法。
- 以上颜色格式之一和一个alpha浮点数的元组。(颜色的alpha值指定其透明度,其中0表示完全透明,1表示完全不透明。当颜色为半透明时,背景颜色会透出。)
基本颜色表:
简写 | 颜色 | 名称 |
b | Blue | 蓝色 |
g | Green | 绿色 |
r | Red | 红色 |
c | Cyan | 青色 |
m | Magenta | 品红 |
y | Yellow | 黄色 |
k | Black | 黑色 |
w | White | 白色 |
曲线图
曲线图颜色设置通过plt.plot()函数参数color实现。
import matplotlib.pyplot as plt
import numpy as np
x=np.linspace(-np.pi, np.pi, 100)
y=np.sin(x)
y_1 = np.cos(x)
plt.plot(x,y,color='.5',label='sin(x)')
plt.plot(x,y_1,color='k',label='cos(x)')
plt.legend()
plt.show()
散点图
散点图函数plt.scatter()提供了通过参数控制颜色的两种选择:所有点同色,或每个点有自己的颜色。
所有点同色(三组数据):
import numpy as np
import matplotlib.pyplot as plt
data_1 = np.random.random((100,2))
data_2 = np.random.random((100,2))
data_3 = np.random.random((100,2))
fig, ax = plt.subplots()
ax.scatter(data_1[:,0], data_1[:,1],color='r')
ax.scatter(data_2[:,0], data_2[:,1],color='k')
ax.scatter(data_3[:,0], data_3[:,1],color='.5')
plt.show()
每个点有自己的颜色(一组数据):
import numpy as np
import matplotlib.pyplot as plt
data = np.random.random((100,2))
colors = ['r','g','b','k']
color_list = []
[color_list.append(i) for i in colors*25 ]
# 列表推导式,等价于
# for color in colors*25:
# color_list.append(color)
fig,ax = plt.subplots()
ax.scatter(data[:,0], data[:,1],color=color_list,edgecolor='k')
plt.show()
使用colormaps:
Matplotlib 有许多内置的 colormap,可以通过 matplotlib.colormaps 访问。还有一些外部库提供了许多额外的 colormap,可以在 Matplotlib 文档的第三方 colormap 部分查看。
要获取所有已注册的颜色映射列表,可以执行:
from matplotlib import colormaps list(colormaps)
colormaps 定义在matplotlib.cm模块中。在绘图函数中,使用cmap参数接收colormap。
import matplotlib.cm as cm
import numpy as np
import matplotlib.pyplot as plt
t=np.linspace(0,2*np.pi,1000)
x=16*(np.sin(t))**3
y=13*np.cos(t)-5*np.cos(2*t)-2*np.cos(3*t)-np.cos(4*t)
fig, ax = plt.subplots(figsize=(8,8))
ax.scatter(x,y,c=x,cmap=cm.hsv)
ax.set_aspect('equal')
ax.axis('off')
plt.show()
注意上图是散点图,只是点比较多看起来像连在一起一样。
条形图
和前面一样,条形图的颜色同样由参数控制。下面是一个简单示例:
import numpy as np
import matplotlib.pyplot as plt
y_1 = np.random.random(5)
y_2 = np.random.random(5)
x = np.arange(5)
fig, axs = plt.subplots(2,2)
axs[0,0].bar(x,y_1,color='r')
axs[0,1].bar(x,-y_2,color='b')
axs[1,0].bar(x,-y_2,color='b')
axs[1,0].bar(x,y_1,color='r')
axs[1,1].axis('off')
fig.tight_layout()
plt.show()
import numpy as np
import matplotlib.pyplot as plt
Y = np.random.random(32)
X = np.arange(32)
colors=['r','g','b','k']
color_list = []
for i in range(32):
if i<8:
color_list.append(colors[0])
elif i<16:
color_list.append(colors[1])
elif i<24:
color_list.append(colors[2])
else:
color_list.append(colors[3])
plt.bar(X,Y,color=color_list)
plt.show()
matplotlib 的 bar 图本身并不直接支持使用 colormap 来自动分配颜色。但是,可以通过一些额外的代码来实现根据 colormap 为每个柱状图分配颜色。 matplotlib中有辅助函数可以明确地从colormap中生成颜色。
plt.show()
#%%
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.colors as colors
import matplotlib.cm as cm
data = np.random.randn(100)
x = np.arange(len(data))
cmap = cm.ScalarMappable(colors.Normalize(),cm.hsv)
colors = cmap.to_rgba(data)
plt.bar(x,data,color=colors)
plt.show()
饼图
饼图接受颜色的可选参数,并且如果给的颜色数量少于分块的数量,颜色会循环使用。
import numpy as np
import matplotlib.pyplot as plt
X = np.random.random(7)
colors = ['b','c','m','y']
plt.pie(X,colors=colors)# 注意参数名称和前面的差异
plt.show()
箱图
import numpy as np
import matplotlib.pyplot as plt
X = np.random.randn(1000)
fig, ax = plt.subplots()
b=ax.boxplot(X)
for name,line_list in b.items():
for line in line_list:
line.set_color('k')
plt.show()
样式
线形和线宽
线性
可以使用字符串 "solid"、"dotted"、"dashed" 或 "dashdot" 定义简单的线型。通过提供一个虚线元组 (offset, (onoffseq)) 可以实现更精细的控制。具体参考Linestyles — Matplotlib 3.9.3 documentation
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 100)
y_1 = np.sin(x)
y_2 = np.cos(x)
y_3 = np.sin(x)+np.cos(x)
plt.plot(x,y_1,color='r',label='sin(x)',linestyle='--')
plt.plot(x,y_2,color='b',label='cos(x)',linestyle='solid')
plt.plot(x,y_3,color='k',label='sin(x)',linestyle='dashdot')
plt.legend()
plt.show()
任何由线条组成的图形都可以进行此类设置。例如,在条形图中,条形的线框就可以进行这种设置。
import matplotlib.pyplot as plt
Y = [1,5,3,6,8,1]
x = np.arange(len(Y))
plt.bar(x,Y,color='b',linestyle='--',edgecolor='r')
plt.show()
线宽
和线性类似,线宽通过参数linewidth控制。
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 100)
y = np.sin(X)
y_1 = np.cos(X)
plt.plot(X,y,color='r',label='sin(x)',linewidth=2)
plt.plot(X,y_1,color='b',label='cos(x)',linewidth=5)
plt.legend()
plt.show()
填充样式
plt.bar()函数可以接受一个参数hatch,该参数可以取:
/ | \ | | | - | + | x | . | * | o | O |
颜色由edgecolor控制。
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(1,10,10)
y = np.sin(X)
plt.bar(X,y,color='m',hatch='\\',width=0.3,edgecolor='y')
plt.bar(X+0.5,y,color='r',hatch='O',width=0.3,edgecolor='y')
plt.show()
注意\时要使用\\。
标记样式
标记的实现方式可以通过使用预定的标记,也有更高级的,比如自定义标记等。高级的部分难度比较大,所以这里暂时只考虑预定的。
所有可能的标记参考这里:
matplotlib.markers — Matplotlib 3.9.3 documentation
这里列出几个常见的:
"."
点
","
像素
"o"
圆
"v"
倒三角
"^"
正三角
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-np.pi, np.pi, 100)
y = np.sin(x)
plt.plot(x,y,label='sin(x)',marker='o',color='r',markevery=10)
# markevery 参数控制每隔多少点标记
plt.scatter(x,y+1,label='sin(x)',marker=',',color='m')
plt.legend()
plt.show()
标记的大小可以通过参数控制,散点图中,参数为s,可以接受一系列值,在曲线图中,参数为markersize,不接受一些列值。
import numpy as np
import matplotlib.pyplot as plt
X = np.linspace(-np.pi, np.pi, 100)
data = np.random.uniform(-np.pi,np.pi,(100,2))
Y = np.sin(X)
s = np.linspace(0,10,len(X))
plt.plot(X,Y,color='b',label='sin(x)',linewidth=2,marker='o',markersize=5,markevery=10)
plt.scatter(data[:,0],data[:,1],color='r',label='random',s = s,marker='^')
plt.legend()
plt.show()
还可以通过参数markeredgewidth,markerfacecolor,markeredgecolor对曲线标记进行更多设置。
根据参考书目,在matplotlib中,各种对象,比如轴、图形和标签都可以单独处理。所有matplotlib对象都从集中配置对象中选择其默认颜色。在matplotlib中,rc为作为中央配置的对象。每个matplotlib对象都会从该rc对象中选择其默认设置。该对象包含一组属性和相关值。
所以我们可以通过每个对象单独设置颜色,也可以统一设置。
import numpy as np
import matplotlib.pyplot as plt
al_v = 0
be_v = 1
theta_v = np.linspace(0, 3*np.pi, 1000)
r = al_v + be_v*theta_v
fig,ax = plt.subplots(subplot_kw=dict(projection='polar'))
ax.plot(theta_v,r,linewidth=2,color='r')
fig.set_facecolor('c')
ax.set_facecolor('m')
plt.show()
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
# 设置全局默认参数
mpl.rc('lines', linewidth=2) # 线条宽度
mpl.rc('axes', facecolor='m') # 绘图区域背景颜色
mpl.rc('figure', facecolor='c') # 图表背景颜色
al_v = 0
be_v = 1
theta_v = np.linspace(0, 3*np.pi, 1000)
r = al_v + be_v*theta_v
fig, ax = plt.subplots(subplot_kw=dict(projection='polar'))
# 绘制螺旋线
ax.plot(theta_v, r, color='r')
# 如果需要更改坐标轴的颜色,可以在这里添加相应的代码
plt.show()