使用多个数据集时在 Matplotlib 中排序的 X 轴刻度
Sorted X axis ticks in Matplotlib when using multiple datasets
我有几个要绘制的数据集。 x 值是“分类”字符串,因为它们没有特别的含义,但它们是可排序的(字母数字)。每个数据集都有一些独特的 X 值和一些共同的 X 值。所需的输出是一个图表,其中 xXtick 标签按排序顺序排列。
不幸的是,我找不到告诉 matplotlib 我想要什么的方法。它正确地将 Y 值组合到公共 X 值上,但将唯一的 X 值放在图表右侧的后续数据集中。
这里有一个例子来说明这个问题:
import matplotlib.pyplot as plt
import numpy as np
# Create first data set
x1 = np.array(['a', 'c', 'e'])
y1 = np.array([1, 2, 5])
# Create second data set with some x values in common with first dataset
x2 = np.array(['a', 'b', 'd', 'e'])
y2 = np.array([2, 4, 1, 1])
# Plot both datasets
fig, ax = plt.subplots()
ax.plot(x1, y1, color='r', marker='+', linestyle='None')
ax.plot(x2, y2, color='b', marker='o', linestyle='None')
结果如下图。
“a”和“e”的值已针对两个数据集正确组合。但我想让“b”和“d”按排序顺序显示,这样 X 刻度标签是“a”、“b”、“c”、“d”、“e”。我可以使用
生成一组组合排序的 X 值
sorted_x = np.sort(np.unique(np.hstack([x1, x2]))))
但我不确定如何利用它来告诉 matplotlib 这是所需的顺序。
您可以先使用 x-values 按所需顺序添加虚拟图。以下代码创建虚拟图,按所需顺序设置 x-values。该图会立即删除,以防止它干扰其他 matplotlib 函数。
import matplotlib.pyplot as plt
import numpy as np
# Create first data set
x1 = np.array(['a', 'c', 'e'])
y1 = np.array([1, 2, 5])
# Create second data set with some x values in common with first dataset
x2 = np.array(['a', 'b', 'd', 'e'])
y2 = np.array([2, 4, 1, 1])
# Plot both datasets
fig, ax = plt.subplots()
sorted_x = np.sort(np.unique(np.hstack([x1, x2])))
sorted_x = np.sort(np.unique(np.hstack([x1, x2])))
# create a dummy plot with the x-values in the desired order, and then remove the plot
ax.plot(sorted_x, np.full(len(sorted_x), np.NaN), color='none')[0].remove()
ax.plot(x1, y1, color='r', marker='+', linestyle='None')
ax.plot(x2, y2, color='b', marker='o', linestyle='None')
plt.show()
我有几个要绘制的数据集。 x 值是“分类”字符串,因为它们没有特别的含义,但它们是可排序的(字母数字)。每个数据集都有一些独特的 X 值和一些共同的 X 值。所需的输出是一个图表,其中 xXtick 标签按排序顺序排列。
不幸的是,我找不到告诉 matplotlib 我想要什么的方法。它正确地将 Y 值组合到公共 X 值上,但将唯一的 X 值放在图表右侧的后续数据集中。
这里有一个例子来说明这个问题:
import matplotlib.pyplot as plt
import numpy as np
# Create first data set
x1 = np.array(['a', 'c', 'e'])
y1 = np.array([1, 2, 5])
# Create second data set with some x values in common with first dataset
x2 = np.array(['a', 'b', 'd', 'e'])
y2 = np.array([2, 4, 1, 1])
# Plot both datasets
fig, ax = plt.subplots()
ax.plot(x1, y1, color='r', marker='+', linestyle='None')
ax.plot(x2, y2, color='b', marker='o', linestyle='None')
结果如下图。
“a”和“e”的值已针对两个数据集正确组合。但我想让“b”和“d”按排序顺序显示,这样 X 刻度标签是“a”、“b”、“c”、“d”、“e”。我可以使用
生成一组组合排序的 X 值sorted_x = np.sort(np.unique(np.hstack([x1, x2]))))
但我不确定如何利用它来告诉 matplotlib 这是所需的顺序。
您可以先使用 x-values 按所需顺序添加虚拟图。以下代码创建虚拟图,按所需顺序设置 x-values。该图会立即删除,以防止它干扰其他 matplotlib 函数。
import matplotlib.pyplot as plt
import numpy as np
# Create first data set
x1 = np.array(['a', 'c', 'e'])
y1 = np.array([1, 2, 5])
# Create second data set with some x values in common with first dataset
x2 = np.array(['a', 'b', 'd', 'e'])
y2 = np.array([2, 4, 1, 1])
# Plot both datasets
fig, ax = plt.subplots()
sorted_x = np.sort(np.unique(np.hstack([x1, x2])))
sorted_x = np.sort(np.unique(np.hstack([x1, x2])))
# create a dummy plot with the x-values in the desired order, and then remove the plot
ax.plot(sorted_x, np.full(len(sorted_x), np.NaN), color='none')[0].remove()
ax.plot(x1, y1, color='r', marker='+', linestyle='None')
ax.plot(x2, y2, color='b', marker='o', linestyle='None')
plt.show()