Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Matplotlib双x轴断裂_Python_Matplotlib_Axes_Twinx - Fatal编程技术网

Python Matplotlib双x轴断裂

Python Matplotlib双x轴断裂,python,matplotlib,axes,twinx,Python,Matplotlib,Axes,Twinx,我正在尝试生成一个matplotlib图,该图由共享x轴的两个子图组成。 一个子图以不同的y轴比例绘制两组数据,另一个子图仅绘制一组数据 我还想“打断”两个子图的x轴,以说明在我的数据中测量之间有一段很长的时间 我尝试过使用本文中给出的解决方案,但作为一个解决方案,该方法无法正确缩放子地块x轴 我一直在尝试使用这个软件包。它似乎可以创建多个子地块,相应地缩放它们,并自动隐藏无关的脊椎、记号和记号标签。 此包似乎不支持与从GridSpec创建的子地块共享x轴(sharex)。 此外,方法twinx

我正在尝试生成一个matplotlib图,该图由共享x轴的两个子图组成。 一个子图以不同的y轴比例绘制两组数据,另一个子图仅绘制一组数据

我还想“打断”两个子图的x轴,以说明在我的数据中测量之间有一段很长的时间

我尝试过使用本文中给出的解决方案,但作为一个解决方案,该方法无法正确缩放子地块x轴

我一直在尝试使用这个软件包。它似乎可以创建多个子地块,相应地缩放它们,并自动隐藏无关的脊椎、记号和记号标签。 此包似乎不支持与从GridSpec创建的子地块共享x轴(
sharex
)。 此外,方法
twinx
在brokenaxes对象上本机不起作用。但是,每个brokenaxes对象都包含子地块轴对象的列表。每个轴对象可用于生成一个
twinx
,尽管这会导致matplotlib重新缩放子地块、重绘脊椎、记号和标签

我已经尝试手动隐藏所有重新绘制的元素,但是我仍然有一些问题

  • 表示断开轴的线放置在错误的位置
  • 在右上方的子地块上有左y轴记号,无法隐藏
  • 右上方子地块上的网格线不正确,且与底部子地块上的x轴不一致
  • 我想对x轴刻度使用日期格式化程序,该程序使用
    '%m-%d'
    ,但尝试时出错:
AttributeError:'CallCurator'对象没有属性'set\u major\u formatter

以下是我尝试的结果:

和代码 用于生成它:

#!/usr/bin/env python3
import matplotlib as mpl
font= {'family': 'Arial',
        'size': 7}
mpl.rc('font', **font)
import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec
from matplotlib.ticker import NullFormatter
import matplotlib.dates as md
from brokenaxes import brokenaxes
import datetime
from pytz import timezone
import numpy as np
from pytz import timezone
import pandas as pd
from glob import glob

volt_color= 'tab:blue'
volt_style = 'solid'
amp_color = 'tab:red'
amp_style='dashed'

# starting date
start = pd.to_datetime("2020-05-20 15:40:09.059089184-07:00", infer_datetime_format=True).to_pydatetime()
start = timezone('US/Pacific').localize(start)

# load data
mudbat_data = pd.read_pickle("mudbat_data.pkl")

# perform rolling mean over data
mv = mudbat_data.rolling(5*60).mean()

# instantiate figures, and broken axes subplots
fig = plt.figure(figsize=(4,2))
gs = GridSpec(2,1)
tz = timezone('US/Pacific')
print(start)
[x1, x2, x3, x4] = [start, datetime.datetime(2020,5,27,tzinfo=tz), datetime.datetime(2020,7,20,tzinfo=tz),datetime.datetime(2020,7,22,tzinfo=tz)]
bax1 = brokenaxes(xlims=((x1,x2),(x3,x4)), subplot_spec=gs[0])
bax3 = brokenaxes(xlims=((x1,x2),(x3,x4)), subplot_spec=gs[1])

# plot first data
bax1.set_ylabel('Cell Voltage (V)')
bax1.plot(mv.index, mv['voltage'], color=volt_color, ls=volt_style)
bax1.tick_params(axis='y', labelcolor=volt_color)
bax1.grid(True)

# ensure all extraneous ticks for bax1 are hidden
bax1.axs[0].yaxis.tick_left()
bax1.axs[0].xaxis.set_ticklabels([])
bax1.axs[0].xaxis.set_ticklabels([])
bax1.axs[0].xaxis.set_ticks_position('none')
bax1.axs[0].yaxis.set_ticks_position('none')

bax1.axs[1].xaxis.set_ticklabels([])
bax1.axs[1].yaxis.set_ticklabels([])
bax1.axs[1].xaxis.set_ticks_position('none')
bax1.axs[1].yaxis.set_ticks_position('none')

# generate bax2 from bax1 axes
bax2 = []
for ax in bax1.axs:
    bax2.append(ax.twinx())

# plot data on bax2 subplots
bax2[0].plot(mv.index, -1E6*mv['current'], color=amp_color, ls=amp_style)
bax2[1].plot(mv.index, -1E6*mv['current'], color=amp_color, ls=amp_style)
bax2[1].set_ylabel('Harvesting Current (μA)')
bax2[1].tick_params(axis='y', labelcolor=amp_color)

# hide generated spines and ticks/labels
bax2[0].spines['right'].set_visible(False)
bax2[0].yaxis.set_ticklabels([])
bax2[0].xaxis.set_ticklabels([])
bax2[0].xaxis.set_ticks_position('none')
bax2[0].yaxis.set_ticks_position('none')

bax2[1].spines['left'].set_visible(False)
bax2[1].xaxis.set_ticklabels([])
bax2[1].xaxis.set_ticks_position('none')
bax2[1].yaxis.tick_right()

# I would like to use this formatter
#bax3.xaxis.set_major_formatter(md.DateFormatter('%m-%d'))
bax3.set_ylabel("Power (uW)")
bax3.grid(True)
bax3.plot(mv.index, 1E6*mv['power'])
bax3.tick_params(axis='x', labelsize=6, rotation=45)

plt.tight_layout(pad=0.4, w_pad=0.5, h_pad=0.5)
plt.subplots_adjust(hspace=0)
plt.savefig('plot.png', dpi=300)
感谢您提供的任何帮助或建议