繁体   English   中英

双轴上的刻度和标签

[英]Ticks and Labels on Twin Axes

如何在额外的轴上设置标签?

所有 4 个轴上的刻度和标签应相同。 我做错了什么...谢谢!

import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True

plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
plt.show()

# create reusable ticks and labels
ticks = [0,1/2,3.14159/4,3.14159/2,1]
labels = [r"$0$", r"$\displaystyle\frac{1}{2}$", r"$\displaystyle\frac{\pi}{4}$", r"$\displaystyle\frac{\pi}{2}$", r"$1$"]

# Version 1: twinx() + xaxis.set_ticks()
plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
ax1.xaxis.set_ticks(ticks, labels=labels)
ax1.yaxis.set_ticks(ticks, labels=labels)
ax2.xaxis.set_ticks(ticks, labels=labels)
ax3.yaxis.set_ticks(ticks, labels=labels)
plt.show()

# Version 2: twinx() + set_xticklabels)()
plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
ax1.set_xticks(ticks)
ax1.set_xticklabels(labels)
ax1.set_yticks(ticks)
ax1.set_yticklabels(labels)
ax2.set_xticks(ticks)
ax2.set_xticklabels(labels)
ax3.set_yticks(ticks)
ax3.set_yticklabels(labels)
plt.show()

在此处输入图像描述

困惑:为什么ax1既有xaxis又有yaxis,而ax2、ax3却没有?

基于matplotlib.axes.Axes.twinx的不直观的解决方案:

创建一个新的轴,其中包含一个不可见的 x 轴和一个与原始轴相反的独立 y 轴(即在右侧)。

这意味着不直观(至少对我而言)您必须在.twin调用中切换 x/y。

  • 不直观地不涉及一般的 matplotlib twinx 功能,而是涉及这样的手动刻度和 label 分配

  • 为了进一步强调这一点,我在代码中使用了ax2_xax3_y

免责声明:不确定添加数据时是否会破坏您的 plot 意图。

  • 可能至少您必须特别注意这些双轴的数据分配 - 牢记“轴切换”。
  • 在为 x/y 轴分配不同的刻度和标签时,还要记住那个轴开关。

但现在我认为这就是您正在寻找的 plot :

在此处输入图像描述

代码:

import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True


# create reusable ticks and labels
ticks = [0,1/2,3.14159/4,3.14159/2,1]
labels = [r"$0$", r"$\displaystyle\frac{1}{2}$", r"$\displaystyle\frac{\pi}{4}$", r"$\displaystyle\frac{\pi}{2}$", r"$1$"]



plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()

ax1.xaxis.set_ticks(ticks, labels=labels)
ax1.yaxis.set_ticks(ticks, labels=labels)


ax2_x = ax1.twiny()  # switch
ax3_y = ax1.twinx()  # switch

ax2_x.xaxis.set_ticks(ticks, labels=labels) 
ax3_y.yaxis.set_ticks(ticks, labels=labels)

plt.show()

或切换x/yaxis.set_ticks - 效果相同:

  • 再想一想,我认为这是首选的方法,尤其是当数据发挥作用时
ax2_x = ax1.twinx()
ax3_y = ax1.twiny()
    
ax2_x.yaxis.set_ticks(ticks, labels=labels)  # switch
ax3_y.xaxis.set_ticks(ticks, labels=labels)  # switch

如果您不打算使用双轴功能(这意味着为这些轴分配具有不同缩放比例的不同数据)但“只”想要所有 4 轴上的刻度和标签以获得更好的 plot 可读性

基于ImportanceOfBeingErnest 答案的解决方案具有相同的 plot 结果:

import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = True


# create reusable ticks and labels
ticks = [0,1/2,3.14159/4,3.14159/2,1]
labels = [r"$0$", r"$\displaystyle\frac{1}{2}$", r"$\displaystyle\frac{\pi}{4}$", r"$\displaystyle\frac{\pi}{2}$", r"$1$"]


plt.figure(figsize=(5,5))
f, ax1 = plt.subplots()

ax1.xaxis.set_ticks(ticks, labels=labels)
ax1.yaxis.set_ticks(ticks, labels=labels)
ax1.tick_params(axis="x", bottom=True, top=True, labelbottom=True, labeltop=True)
ax1.tick_params(axis="y", left=True, right=True, labelleft=True, labelright=True)

plt.show()

ax2 = ax1.twinx()ax1共享 x 轴。
ax3 = ax1.twiny()ax1共享 y 轴。
因此,您设置ax2.xaxisax3.yaxis的刻度和刻度标签的两行与您已经在ax1上应用的更改是多余的。


import matplotlib.pyplot as plt
plt.rcParams['text.usetex'] = False # My computer doesn't have LaTeX, don't mind me. 

# Create reusable ticks and labels.
ticks = [0, 1/2, 3.14159/4, 3.14159/2, 1]
labels = [r"$0$", r"$\frac{1}{2}$", r"$\frac{\pi}{4}$", r"$\frac{\pi}{2}$", r"$1$"]

# Set the ticks and ticklabels for each axis.
fig = plt.figure(figsize=(5,5))
ax1 = fig.add_subplot()
ax2 = ax1.twinx()
ax3 = ax1.twiny()
for axis in (ax1.xaxis,
             ax1.yaxis,
             ax2.yaxis,
             ax3.xaxis):
    axis.set_ticks(ticks)
    axis.set_ticklabels(labels)
fig.show()

在此处输入图像描述

请注意,如果我注释掉关于ax2ax3的工作,我们就会得到您在问题中的确切内容:


for axis in (ax1.xaxis, ax1.yaxis,
             # ax2.yaxis,
             # ax3.xaxis,
            ):
    axis.set_ticks(ticks)
    axis.set_ticklabels(labels)

在此处输入图像描述

现在让我们通过修改ax2来破坏ax1 ,只是为了表明双胞胎之间的界限运作良好:

ax2.xaxis.set_ticks(range(10))
ax2.xaxis.set_ticklabels(tuple("abcdefghij"))

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM