有没有办法在MATPLOTLIB中使用两个具有不同标签的轴?

有没有办法在MATPLOTLIB中使用两个具有不同标签的轴?,matplotlib,axis-labels,Matplotlib,Axis Labels,我正在尝试创建一个绘图,底部有一个x轴,带有基于文本的标签,顶部有另一个,具有不同的基于文本的标签 到目前为止,我找到的最接近的东西是‘secondary_axis’(),但当我尝试填充基于文本的标签时,出现了一个TypeError:unhabable type:numpy.ndarray 我根据以下代码生成了一个示例: 最好将蔬菜作为标签放在顶部栏中。你知道如何处理这个问题吗?你将轴比例的概念与轴标签混为一谈。次_轴的函数及其逆函数用于变换坐标,而不是标签 原则上,如果允许设置一个不同的格式化

我正在尝试创建一个绘图,底部有一个x轴,带有基于文本的标签,顶部有另一个,具有不同的基于文本的标签

到目前为止,我找到的最接近的东西是‘secondary_axis’(),但当我尝试填充基于文本的标签时,出现了一个
TypeError:unhabable type:numpy.ndarray

我根据以下代码生成了一个示例:


最好将蔬菜作为标签放在顶部栏中。你知道如何处理这个问题吗?

你将轴比例的概念与轴标签混为一谈。
次_轴的函数及其逆函数
用于变换坐标,而不是标签

原则上,如果允许设置一个不同的格式化程序,那么使用一个次轴就很好了。不幸的是,目前情况并非如此

另一种选择是使用双轴。但这对具有相同纵横比的轴不起作用

因此,作为最后手段,我们可以在旧轴的基础上创建一个新轴,并对其进行一致的格式化:

import numpy as np
import matplotlib.pyplot as plt

vegetables = ["cucumber", "tomato", "lettuce", "asparagus",
              "potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening",
           "Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]

farmers_to_vegetables = dict(zip(farmers, vegetables))

harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
                    [2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
                    [1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
                    [0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
                    [0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
                    [1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
                    [0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])


fig, ax = plt.subplots()
im = ax.imshow(harvest)

# We want to show all xticks...
ax.set_xticks(np.arange(len(farmers)))
# ... and label them with the respective list entries
ax.set_xticklabels(farmers)

# Rotate the tick labels and set their alignment.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
         rotation_mode="anchor")

ax2 = fig.add_subplot(111, label="secondary")
ax2.set_aspect("equal")
ax2.set_xlim(ax.get_xlim())
ax2.set_ylim(ax.get_ylim())
ax2.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False,
                top=True, labeltop=True)
ax2.set_facecolor("none")
for _, spine in ax2.spines.items():
    spine.set_visible(False)

ax2.set_xticks(ax.get_xticks())
ax2.set_xticklabels([farmers_to_vegetables[x.get_text()] for x in ax.get_xticklabels()])
plt.setp(ax2.get_xticklabels(), rotation=45, ha="left",
         rotation_mode="anchor")

fig.tight_layout()
plt.show()

import numpy as np
import matplotlib.pyplot as plt

vegetables = ["cucumber", "tomato", "lettuce", "asparagus",
              "potato", "wheat", "barley"]
farmers = ["Farmer Joe", "Upland Bros.", "Smith Gardening",
           "Agrifun", "Organiculture", "BioGoods Ltd.", "Cornylee Corp."]

farmers_to_vegetables = dict(zip(farmers, vegetables))

harvest = np.array([[0.8, 2.4, 2.5, 3.9, 0.0, 4.0, 0.0],
                    [2.4, 0.0, 4.0, 1.0, 2.7, 0.0, 0.0],
                    [1.1, 2.4, 0.8, 4.3, 1.9, 4.4, 0.0],
                    [0.6, 0.0, 0.3, 0.0, 3.1, 0.0, 0.0],
                    [0.7, 1.7, 0.6, 2.6, 2.2, 6.2, 0.0],
                    [1.3, 1.2, 0.0, 0.0, 0.0, 3.2, 5.1],
                    [0.1, 2.0, 0.0, 1.4, 0.0, 1.9, 6.3]])


fig, ax = plt.subplots()
im = ax.imshow(harvest)

# We want to show all xticks...
ax.set_xticks(np.arange(len(farmers)))
# ... and label them with the respective list entries
ax.set_xticklabels(farmers)

# Rotate the tick labels and set their alignment.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",
         rotation_mode="anchor")

ax2 = fig.add_subplot(111, label="secondary")
ax2.set_aspect("equal")
ax2.set_xlim(ax.get_xlim())
ax2.set_ylim(ax.get_ylim())
ax2.tick_params(left=False, labelleft=False, bottom=False, labelbottom=False,
                top=True, labeltop=True)
ax2.set_facecolor("none")
for _, spine in ax2.spines.items():
    spine.set_visible(False)

ax2.set_xticks(ax.get_xticks())
ax2.set_xticklabels([farmers_to_vegetables[x.get_text()] for x in ax.get_xticklabels()])
plt.setp(ax2.get_xticklabels(), rotation=45, ha="left",
         rotation_mode="anchor")

fig.tight_layout()
plt.show()