在数据科学和分析领域,有效地展示和交流数据至关重要。虽然基础图表如条形图和散点图不可或缺,但深入研究高级可视化图表可以揭示更深层次的洞察,并增强叙事能力。以下是可以使用Matplotlib创建的十大高级图表类型。
3D曲面图对于探索三个变量之间的关系非常有用。使用Matplotlib创建3D图表非常简单,允许可视化景观或曲面。这些图表在气象学、工程和金融等领域特别有用,因为理解变量之间的交互至关重要。
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
x, y = np.meshgrid(x, y)
z = np.sin(np.sqrt(x**2 + y**2))
surf = ax.plot_surface(x, y, z, cmap='viridis')
fig.colorbar(surf, shrink=0.5, aspect=5)
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
plt.show()
热力图是表示数据的一种绝佳方式,其中颜色代表现象的大小。它们广泛用于表示相关性矩阵,可以突出显示变量之间的关系,或用于显示地理数据密度。
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10, 10) # 随机数据用于演示
plt.imshow(data, cmap='hot', interpolation='nearest')
plt.colorbar()
plt.title('热力图示例')
plt.show()
等高线图适用于使用等高线在二维中表示三维数据。这些线连接等值点。等高线图通常用于气象学和地理学中表示海拔,或用于可视化机器学习中的优化景观。
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5, 100)
y = np.linspace(-5, 5, 100)
X, Y = np.meshgrid(x, y)
Z = np.sin(np.sqrt(X**2 + Y**2))
plt.figure(figsize=(8, 6))
contour = plt.contour(X, Y, Z, colors='black')
plt.clabel(contour, inline=True, fontsize=8)
plt.title('等高线图')
plt.xlabel('x轴')
plt.ylabel('y轴')
plt.contourf(X, Y, Z, cmap='viridis')
plt.colorbar()
plt.show()
流场图或流场图非常适合表示流体流动、气流或任何其他矢量场。它们给人一种运动和方向感,展示了矢量场如何在平面上流动,这对于工程和环境研究至关重要。
可视化时间序列数据是金融、气象和工程中数据分析的基本方面。Matplotlib可以绘制复杂的时间序列数据,使其更容易识别趋势、周期和季节性。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
dates = pd.date_range(start='2021-01-01', end='2021-12-31', freq='D')
data = np.random.randn(len(dates)).cumsum()
df = pd.DataFrame(data, index=dates, columns=['值'])
plt.figure(figsize=(10, 6))
plt.plot(df.index, df['值'], marker='o', linestyle='-', markersize=2)
plt.title('时间序列图示例')
plt.xlabel('日期')
plt.ylabel('值')
plt.grid(True)
plt.xticks(rotation=45)
plt.show()
小提琴图表示数值数据,并将箱线图与核密度图结合起来。它们特别适用于比较不同类别之间的数据分布。
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
np.random.seed(10) # 为了可重复的结果
data = np.random.normal(loc=0, scale=1, size=100)
categories = ['A']*50 + ['B']*50
data = np.append(data, np.random.normal(loc=0.5, scale=1.5, size=100))
categories = np.array(categories + ['A']*50 + ['B']*50)
df = pd.DataFrame({'类别': categories, '值': data})
plt.figure(figsize=(8, 6))
sns.violinplot(x='类别', y='值', data=df)
plt.title('小提琴图示例')
plt.xlabel('类别')
plt.ylabel('值')
plt.show()
使用箭头可视化矢量场的方向和大小。这对于理解风向模式、流体流动或磁场等现象非常有价值。
import numpy as np
import matplotlib.pyplot as plt
x, y = np.meshgrid(np.linspace(-5, 5, 20), np.linspace(-5, 5, 20))
u = -y
v = x
plt.figure(figsize=(8, 6))
plt.quiver(x, y, u, v, color='r')
plt.title('矢量场图')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.xlim([-5, 5])
plt.ylim([-5, 5])
plt.show()
在单个图表中创建多个子图是Matplotlib的一个高级特性,允许比较不同的数据集或同一数据的不同视图。使用GridSpec,可以自定义图表布局,控制它们的位置、大小和纵横比。
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
import numpy as np
fig = plt.figure(figsize=(10, 8))
gs = gridspec.GridSpec(3, 3, fig)
ax1 = fig.add_subplot(gs[0, :])
ax2 = fig.add_subplot(gs[1, :-1])
ax3 = fig.add_subplot(gs[1:, 2])
ax4 = fig.add_subplot(gs[2, 0])
ax5 = fig.add_subplot(gs[2, 1])
data1 = np.random.randn(100).cumsum()
data2 = np.random.rand(10)
data3 = np.random.rand(10,10)
data4 = np.random.randn(100)
data5 = np.random.randn(100).cumsum()
ax1.plot(data1, label='线图')
ax1.set_title('顶部跨度图')
ax1.legend()
ax2.bar(np.arange(len(data2)), data2, color='orange', label='条形图')
ax2.set_title('条形图')
ax2.legend()
ax3.imshow(data3, cmap='viridis', aspect='auto', label='热力图')
ax3.set_title('热力图')
ax4.hist(data4, bins=20, color='green', label='直方图')
ax4.set_title('直方图')
ax4.legend()
ax5.scatter(np.arange(len(data5)), data5, color='red', label='散点图')
ax5.set_title('散点图')
ax5.legend()
plt.tight_layout()
plt.show()
import plotly.express as px
import pandas as pd
data = {
"州": ["CA", "TX", "NY", "FL", "IL", "PA", "OH", "GA", "NC", "MI"],
"值": [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
}
df = pd.DataFrame(data)
fig = px.choropleth(df,
locations='州',
locationmode="USA-states",
color='值',
color_continuous_scale=px.colors.sequential.Plasma,
scope="usa",
labels={'值':'示例值'}
)
fig.update_layout(title_text = '美国州地理热力图')
fig.show()
import numpy as np
import matplotlib.pyplot as plt
x, y = np.meshgrid(np.linspace(-2, 2, 20), np.linspace(-2, 2, 20))
u = -y
v = x
plt.figure(figsize=(6, 6))
plt.quiver(x, y, u, v, color='blue')
plt.title('箭头图示例')
plt.xlabel('X轴')
plt.ylabel('Y轴')
plt.xlim([-2, 2])
plt.ylim([-2, 2])
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.grid(True)
plt.show()