【问题标题】:Matplotlib: Plot two x axes, one linear and one with logarithmic ticksMatplotlib:绘制两个 x 轴,一个是线性的,一个是对数刻度
【发布时间】:2017-09-20 13:33:19
【问题描述】:

(大量编辑:)

在 python matplotlib 中,我想用两个 xscale 绘制 yx,下一个带有线性刻度,上一个带有对数刻度。

较低的x 值是较高值的任意 函数(在这种情况下映射为func(x)=np.log10(1.0+x))。推论:上方的x刻度位置与下方的任意函数相同。

数据点的位置和两个轴的刻度位置必须解耦。

我希望上轴的对数刻度位置和标签尽可能整齐。

制作这样一个情节的最佳方法是什么?

相关: http://matplotlib.1069221.n5.nabble.com/Two-y-axis-with-twinx-only-one-of-them-logscale-td18255.html

类似(但未回答)的问题?: Matplotlib: how to set ticks of twinned axis in log plot

可能有用: https://stackoverflow.com/a/29592508/1021819

【问题讨论】:

  • 你试过twiny()吗?
  • @BusyBeaver 我没有 (twinx()?) - 你能给出答案吗?
  • 您想在两个x-axis 之间共享y-axis(对吗?)所以twiny()
  • 啊-是-正确
  • 问题是当比例之间的关系是非线性时,您不能使用两个不同比例的轴在相同的位置显示相同的数据。那就是数学。您可以做的是使用两个相似的刻度,但带有不同的刻度标签。现在的问题是,鉴于此,期望的结果确实不清楚,因此您没有收到任何有用的答案。

标签: python matplotlib


【解决方案1】:

您可能会发现Axes.twiny()Axes.semilogx() 很有用。

import numpy as np
import matplotlib.pyplot as plt

fig, ax1 = plt.subplots()

x = np.arange(0.01, 10.0, 0.01) # x-axis range
y = np.sin(2*np.pi*x) # simulated signal to plot

ax1.plot(x, y, color="r") # regular plot (red)
ax1.set_xlabel('x')

ax2 = ax1.twiny() # ax1 and ax2 share y-axis
ax2.semilogx(x, y, color="b") # semilog plot (blue)
ax2.set_xlabel('semilogx')

plt.show()

【讨论】:

  • 谢谢 - 有用的开始 - 我已将其中一些添加到我的编辑中
  • 我看到了您的编辑...如果您更改x-axis 比例,为什么红叉需要与黑点重合
  • 我想要一组数据点(只有一个数据系列)。我接受了你的想法,但它给出了上述内容;我需要对上 x 轴做一些事情来实现它 - 我想看看 yzlog10(1+z) 的变化。
  • 例如,在你的情节中,顶部的 10^0 应该与底部的 1.0 对齐?
  • 但这不是半对数图的工作方式...如果您将10**01.0 对齐,那么蓝色图将与红色图完美匹配,您将失去半对数表示,这是你第一次问的;即,如果顶部的 10^0 应该与底部的 1.0 对齐,那么就像在红色信号上方重新绘制相同的信号一样。
【解决方案2】:

在与几个人交谈后尝试回答,感谢@BusyBeaver。

我同意这个问题是不恰当的,并将对其进行修改以澄清(欢迎帮助!)。

我确实认为这是在 stackoverflow 上写下来的有用内容。

代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import AutoMinorLocator

# Necessary functions

def tick_function(x):
    """Specify tick format"""
    return ["%2.f" % i for i in x]

def func(x):
    """This can be anything you like"""
    funcx=np.log10(1.0+x)
    return funcx

z=np.linspace(0.0,4.0,20)

np.random.seed(seed=1234)
y=np.random.normal(10.0,1.0,len(z))

# Set up the plot
fig,ax1 = subplots()
ax1.xaxis.set_minor_locator(AutoMinorLocator())
ax1.yaxis.set_minor_locator(AutoMinorLocator())

# Set up the second axis
ax2 = ax1.twiny()

# The tick positions can be at arbitrary positions
zticks=np.arange(z[0],z[-1]+1)
ax2.set_xticks(func(zticks))
ax2.set_xticklabels(tick_function(zticks))
ax2.set_xlim(func(z[0]),func(z[-1]))
ax1.set_ylim(5.0,15.0)

ax1.set_xlabel(r'$\log_{10}\left(1+z\right)$')
ax2.set_xlabel(r'$z$')
ax1.set_ylabel('amplitude/arb. units')

plt.tick_params(axis='both',which = 'major', labelsize=8, width=2)
plt.tick_params(axis='both',which = 'minor', labelsize=8, width=1)

_=ax1.plot(func(z),y,'k.')

plt.savefig('lnopz2.png')

我不确定如何控制上部 ax2 次要刻度(例如每 0.5 次)。

【讨论】:

  • 我仍然看不出这在阅读情节时有什么用处;)
  • 因为我想跟踪两个(相关的)变量,否则我必须一直在心理上转换。
  • 在多大程度上它不是stackoverflow.com/questions/45440474/…的副本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2016-10-27
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2015-04-02
相关资源
最近更新 更多