matplotlib样式和颜色

本笔记参考:

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表示完全不透明。当颜色为半透明时,背景颜色会透出。)

基本颜色表:

简写颜色名称
bBlue蓝色
gGreen绿色
rRed红色
cCyan青色
mMagenta品红
yYellow黄色
kBlack黑色
wWhite白色

 曲线图

曲线图颜色设置通过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.*oO

颜色由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

这里列出几个常见的:

"."

m00

","

m01

像素

"o"

m02

"v"

m03

倒三角

"^"

m04

正三角

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()

### 如何自定义 Matplotlib 图表的颜色样式 #### 颜色定制方法 为了给 Matplotlib 中的图表设置颜色,尤其是对于 `bar` 图形而言,虽然其不直接支持通过 colormap 自动生成颜色[^1],但可以通过手动操作实现这一功能。具体来说,可以利用 `matplotlib.cm` `matplotlib.colors` 提供的功能来创建基于数据值的颜色映射。 以下是完整的代码示例: ```python import matplotlib.pyplot as plt import numpy as np import matplotlib.colors as colors import matplotlib.cm as cm data = np.random.randn(10) # 创建随机数据 x = np.arange(len(data)) # 定义颜色映射器 cmap = cm.ScalarMappable(colors.Normalize(vmin=min(data), vmax=max(data)), cm.viridis) # 获取对应于每个数据点的颜色 colors_list = cmap.to_rgba(data) # 绘制条形图并应用颜色列表 plt.bar(x, data, color=colors_list) plt.colorbar(cmap) # 添加颜色条以便解释颜色含义 plt.show() ``` 上述代码展示了如何使用 `ScalarMappable` 将数值范围转换成颜色,并将其应用于柱状图上。 --- #### 样式定制方法 除了颜色之外,还可以进一步增强图表的整体视觉效果。这通常涉及全局样式的修改以及局部属性(如字体、线条宽度等)的调整。下面是一个综合的例子,展示如何通过编写辅助函数来自定义 Matplotlib样式[^2]。 ```python def custom_style(): """ 自定义 Matplotlib 图表样式 """ from matplotlib import rcParams # 使用预设风格模板 plt.style.use('seaborn-darkgrid') # 设置中文字体支持 rcParams['font.sans-serif'] = ['SimHei'] rcParams['axes.unicode_minus'] = False # 调整默认参数 rcParams.update({ 'lines.linewidth': 2, 'figure.figsize': (8, 6), 'xtick.labelsize': 14, 'ytick.labelsize': 14, 'axes.titlesize': 18, 'axes.labelsize': 16, 'legend.fontsize': 12, 'grid.color': '#cccccc', 'grid.alpha': 0.7 }) # 应用样式到绘图过程 custom_style() fig, ax = plt.subplots() ax.plot([1, 2, 3], label="Sample Line", marker='o', linestyle="--") ax.set_title("带自定义样式的折线图") ax.legend() plt.show() ``` 此部分代码说明了如何封装一个通用的样式配置函数 `custom_style()` 并在实际绘制过程中调用它。 --- #### 结合两者的效果演示 如果希望同时实现复杂的颜色方案与高级别的图形美化,则可将以上两种技术结合起来。例如,在同一个脚本里既引入动态色彩又加载特定主题。 ```python from matplotlib import pyplot as plt import numpy as np import matplotlib.colors as mcolors import matplotlib.cm as mcmaps def apply_custom_theme(): plt.style.use('ggplot') apply_custom_theme() values = np.random.uniform(-1, 1, size=(15,)) positions = range(len(values)) color_map = mcmaps.coolwarm norm = mcolors.Normalize(vmin=np.min(values), vmax=np.max(values)) rgba_colors = color_map(norm(values)) plt.figure(figsize=(9, 5)) bars = plt.bar(positions, values, width=.6, edgecolor="black", linewidth=1., color=rgba_colors) sm = plt.cm.ScalarMappable(cmap=color_map, norm=norm) sm.set_array([]) cb = plt.colorbar(sm) cb.ax.tick_params(labelsize=12) cb.set_label('Value Range', fontsize=14) plt.title("Bar Chart with Custom Colors and Theme", fontsize=16) plt.xlabel("Index Position", fontsize=14) plt.ylabel("Random Value", fontsize=14) plt.tight_layout() plt.show() ``` 这里不仅实现了渐变填充效果,而且整体外观也因采用了 ggplot 主题而显得更加现代美观。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值