- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我尝试在 matplotlib
中使用 twiny()
从包含这些数据 block 的 XML 文件中绘制具有两个 x 轴的曲线:
<data>
<meas>
<utc>2018-11-10T22:27:06.500003</utc>
<ra_j2000>23.9722686269</ra_j2000>
<dec_j2000>-1.23845121893</dec_j2000>
<mag>9.96074403533</mag>
</meas>
<meas>
<utc>2018-11-10T22:27:54.500002</utc>
<ra_j2000>23.9930913364</ra_j2000>
<dec_j2000>-1.03788334773</dec_j2000>
<mag>11.356437889</mag>
</meas>
<meas>
<utc>2018-11-10T22:38:36.500002</utc>
<ra_j2000>0.267638646848</ra_j2000>
<dec_j2000>1.56055091433</dec_j2000>
<mag>11.1642458641</mag>
</meas>
<meas>
<utc>2018-11-10T22:46:18.500000</utc>
<ra_j2000>0.462353662364</ra_j2000>
<dec_j2000>3.34334963425</dec_j2000>
<mag>11.1082534741</mag>
</meas>
<meas>
<utc>2018-11-10T22:57:18.500001</utc>
<ra_j2000>0.740393528722</ra_j2000>
<dec_j2000>5.78641590694</dec_j2000>
<mag>11.0688955214</mag>
</meas>
<meas>
<utc>2018-11-10T23:03:06.499995</utc>
<ra_j2000>0.888541738338</ra_j2000>
<dec_j2000>7.03265231497</dec_j2000>
<mag>10.2358937709</mag>
</meas>
<meas>
<utc>2018-11-10T23:05:42.500002</utc>
<ra_j2000>0.955591973177</ra_j2000>
<dec_j2000>7.5832430461</dec_j2000>
<mag>10.86206725</mag>
</meas>
<meas>
<utc>2018-11-10T23:06:48.499999</utc>
<ra_j2000>0.984093767077</ra_j2000>
<dec_j2000>7.81466175077</dec_j2000>
<mag>10.3466108708</mag>
</meas>
</data>
我的问题是这些 x 轴上的值未对齐。这是我的 Python 脚本:
import math
import xml.etree.ElementTree as ET
from astropy.time import Time
from astropy.coordinates import get_sun
from datetime import datetime, timedelta
import matplotlib.pyplot as plt
import matplotlib.ticker as ticker
from matplotlib import dates
tree = ET.parse('20181110_10241.xml')
root = tree.getroot()
x_ut = []
x_phi = []
y_brightness = []
def convert_time(obs_time):
obs_time = str(obs_time)
d, t = obs_time.split('T')
year, month, day = map(int, d.split('-'))
hour, minute, second = t.split(':')
return datetime(year, month, day, int(hour), int(minute)) + \
timedelta(seconds=float(second))
def get_sun_coords(obs_time):
sun_coords = get_sun(obs_time)
sun_ra = sun_coords.ra.degree
sun_dec = sun_coords.dec.degree
return sun_ra, sun_dec
def get_phase_angle(sun_ra, sun_dec, target_ra, target_dec):
phase_angle = math.degrees(math.acos(-math.sin(math.radians(sun_dec))*math.sin(math.radians(target_dec)) - math.cos(math.radians(sun_dec))*math.cos(math.radians(target_dec))*math.cos(math.radians(sun_ra-target_ra))))
return phase_angle
for meas in root.findall('meas'):
obs_time = Time(meas.find('utc').text, format='isot', scale='utc')
target_ra = float(meas.find('ra_j2000').text)*15
target_dec = float(meas.find('dec_j2000').text)
mag = float(meas.find('mag').text)
sun_ra, sun_dec = get_sun_coords(obs_time)
phase_angle = get_phase_angle(sun_ra, sun_dec, target_ra, target_dec)
obs_time = convert_time(obs_time)
x_ut.append(obs_time)
x_phi.append(phase_angle)
y_brightness.append(mag)
fig, ax1 = plt.subplots()
ax1.plot(x_ut, y_brightness, marker='o', label='apparent brightness')
ax1.set_xlim(x_ut[0],x_ut[-1])
ax1.xaxis.set_major_locator(dates.MinuteLocator(interval=1))
ax1.xaxis.set_major_formatter(dates.DateFormatter('%H:%M'))
ax1.tick_params(axis='x', rotation=45)
ax1.minorticks_on()
ax1.legend()
ax1.grid()
ax1.set_xlabel('time [h:m, UT]')
ax1.set_ylabel('apparent brightness [mag, CR]')
ax2 = ax1.twiny()
ax2.plot(x_phi,y_brightness, marker='^', color='red')
ax2.set_xlim(x_phi[0],x_phi[-1])
ax2.xaxis.set_major_locator(ticker.MultipleLocator(1))
ax2.minorticks_on()
ax2.set_xlabel('phase angle (phi) [deg]')
plt.gca().invert_yaxis()
plt.tight_layout(pad=0)
plt.show()
生成以下图:
我打算稍后隐藏红色曲线(通过使用 visibility=False
),在这里我绘制它只是为了查看 x 轴值的正确对齐,即两条曲线必须( !)事实上重叠,因为相位角(x_phi
)值取决于相应的时间戳(x_ut
)值,但正如您可以清楚地看到的,只有开始和末端对齐正确,但中间的大部分数据未对齐(相位曲线向右移动)。
我做错了什么?
最初,我认为相位角 (x_phi
) 随时间非线性变化,因此两条曲线的 set_xlim()
拉伸(stretch)它们的方式不同,但是这事实并非如此,我已经针对 x_ut
绘制了 x_phi
,并且存在明显的线性变化:
感谢您提前提供的任何帮助!
编辑:非线性已由电话在下面的答案中证明。因此,我稍微改变了我的问题。
如果我从子图 ax1
和 ax2
中删除 set_xlim()
,则:
1) 上面的 x 轴会自动反转,从最小值开始,尽管给出值的列表 x_phi
从最大值开始 - 我怎样才能避免这种反转不使用invert_axis()
? (在不同情况下,x_phi
列表中的值始终只有递增或递减)
2)一共有3个列表:x_ut
、x_phi
和y_brightness
;我实际上只需要绘制 y_brightness
与 x_ut
的曲线,另外还有 x_phi
的值(使用 ticker.MultipleLocator (1)
) 与 x_ut
中相应的时刻值对齐——我该怎么做?
我的问题与此类似: How do I align gridlines for two y-axis scales using Matplotlib?但在我的例子中,上 x 轴的刻度之间没有线性间距,因此我无法使用该解决方案。
此外,这个问题也涉及类似的问题: trouble aligning ticks for matplotlib twinx axes但在我的例子中,我不知道如何表达两个 x 轴之间的关系,因为数据类型非常不同:datetime 与 float。它们之间的唯一关系是一对一的,即 x_ut
中的第一个值与 x_phi
中的第一个值相关,第二个值与第二个值相关,并且等等;并且这种关系是非线性的。
编辑2:我之前编辑中的数字1)现在已经解决。对于问题的其余部分,看起来我必须使用 register_scale()
才能相对于主 x 轴重新缩放辅助 x 轴。为此,我还必须定义 matplotlib.scale.ScaleBase 的子类。到目前为止,我只找到了两个(对我来说)复杂的示例来说明如何做到这一点:
https://matplotlib.org/examples/api/custom_scale_example.html
https://stackoverrun.com/es/q/8578801 (西类牙语,但代码内有英文注释)
我不确定我是否能够自己实现这一点,所以我仍然寻求任何帮助。
最佳答案
耶!我已经成功地获得了所寻求的结果,而无需定义新的规模类别!以下是问题脚本中添加/修改的相关代码部分(变量 step
稍后将从用户命令行输入中读取,或者我可能会找到另一种自动滴答频率的方法设置):
x_ut = []
x_phi = []
x_phi_ticks = []
x_phi_ticklabels = []
y_brightness = []
# populate lists for the phase angle ticks and labels
i = 0
step = 15
while i <= (len(x_ut)-step):
x_phi_ticks.append(x_ut[i])
x_phi_ticklabels.append(x_phi[i])
i += step
x_phi_ticks.append(x_ut[-1])
x_phi_ticklabels.append(x_phi[-1])
# plot'em all
fig, ax1 = plt.subplots()
ax1.plot(x_ut, y_brightness, marker='o', label='apparent brightness')
ax1.xaxis.set_major_locator(dates.MinuteLocator(interval=1))
ax1.xaxis.set_major_formatter(dates.DateFormatter('%H:%M'))
ax1.tick_params(axis='x', rotation=45)
ax1.minorticks_on()
ax1.legend()
ax1.grid(which='major', linestyle='-', color='#000000')
ax1.grid(which='minor', linestyle='--')
ax1.set_xlabel('time [h:m, UT]')
ax1.set_ylabel('apparent brightness [mag, CR]')
ax2 = ax1.twiny()
ax2.set_xlim(ax1.get_xlim())
ax2.set_xticks(x_phi_ticks)
ax2.set_xticklabels(x_phi_ticklabels)
ax2.set_xlabel('phase angle (phi) [deg]')
plt.gca().invert_yaxis()
plt.tight_layout(pad=0)
plt.show()
关于python - Matplotlib——双胞胎 : how to align values of two x-axes in one plot?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53458959/
是否有我遗漏的原因或某些原因让 Sitecore 为 true 和 Item.Axes.IsDescendantOf() 返回 Item.Axes.IsAncestorOf() ? var test
我最近重构了很多代码,想要一个干净的环境,所以我删除并重新创建了数据库模式,创建了一个新的 venv,并从 pip3 一个一个地安装依赖项,所以我没有'有任何从旧环境遗留下来的多余包。我很快安装了六个
我有一个返回 Figure 对象的外部函数,在这种情况下,每个 Figure 对象都由一个 Axes 对象组成。 我想组成一个由这两个图形组成的新图形(比方说水平连接)。 所以理想情况下,我想说: f
文件说 Axes.text(self, x, y, s, fontdict=None, withdash=deprecated parameter, **kwargs) Add text to the
我对编程和尝试学习 Python 完全陌生。因此,请在询问转储问题的阶段耐心等待。上面的错误是我尝试将 matplotlib.pyplot 导入 Python 时遇到的错误。我不确定如何解决这个问题,
谁能告诉我如何在图表的 x-y 轴上写标签?那些写着“时间(秒)”和“速度(米/秒)”的。 我正在使用 System.Windows.Forms.DataVisualization.Charting.
sitecore 中 item.Axes.GetDescendants() 和 item.Axes.selectitems() 之间的基本/性能区别是什么? 最佳答案 item.Axes.GetDes
我在 Seaborn 中有一个包含 10 个图的 FacetGrid 图表,其中的图略有重叠。我想改变整体图形的大小。当我在下面的代码中使用 g.fig.subplots(figsize=(12,12
有没有一种方法可以检查是否从数据库中检索到字段?我创建了一些从不同位置调用的逻辑。但在某些位置,表缓冲区是使用字段列表选择的。我只想在未检索到该字段的情况下再次执行查询。获取正确记录的查询非常繁重,并
我最近将 django-axes 添加到我的 Django 项目中。它应该用 django-restframework 来解决这个问题。但是,我使用 django-rest-framework-sim
我正在使用 Java2d 开发应用程序。我注意到的奇怪的事情是,原点在左上角,正 x 向右移动,正 y 向下增加。 有没有办法把原点移到左下角? 谢谢。 最佳答案 您将需要进行缩放和翻译。 在您的 p
当前有效matplotlib版本为:3.4.1。 概述 axes()函数功能与subplot()函数极其相似。都是向当前图像(figure)添加一个子图(Axes),并将该子图设为当前子图或者将
XPath 中的 轴( Axes ) 可用于选取相对于当前节点的节点集 XML 范例文档 我们将在接下来的范例中使用下面这份 XML 文档 <?xml version="1.0&
是否可以使用xpath语法进行基于日期的查询?我研究的一切都表明这是不可能的。我正在查询一组日历,只想取回一个月的数据-我可以使用哪些策略来实现这一目标? 2010年8月10日:编辑以获取更多信息 我
所以我有这两个函数来绘制时间序列和直方图。 ax1 = plotTimeSeries(df=dfDelay_Vector) ax2 = plotHistogram( df=dfDelay_Hist)
我有一个 matplotlib Axes对象 self.a在 matplotlib 上定义canvas对象 self.fold_canvas .在它的构建过程中,在某些时候我在地 block 上绘制了
我想知道如何键入提示 matplotlib-subplots 的轴对象的“最佳”方法。 运行 from matplotlib import pyplot as plt f, ax = plt.subp
我们想要在 azure 上部署 AX Dynamics,我们已经创建了 DC/AX AOS/SQL VM 的 . 客户的本地 Pc/AX 客户端如何连接到 azure DC VM? 我可以在不创建虚拟
我想用我选择的颜色图绘制散点图。 我的代码: # Create a scatter plot. scatter = axes[1][1].scatter( fourth.VALP, # First v
我仍在使用 https://github.com/syntagmatic/parallel-coordinates#parallel-coordinates 绘制平行坐标图和 d3.js 轴重新排序后
我是一名优秀的程序员,十分优秀!