Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.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中移动轴标签、移动子批次和修改轴缩放_Python_Pandas_Matplotlib - Fatal编程技术网

Python 如何在matplotlib中移动轴标签、移动子批次和修改轴缩放

Python 如何在matplotlib中移动轴标签、移动子批次和修改轴缩放,python,pandas,matplotlib,Python,Pandas,Matplotlib,我正试图制作一个这样的情节 使用matplotlib 目前我有这个图: 它是使用以下代码生成的: import matplotlib.pyplot as plt import matplotlib as mpl import pandas as pd width = 0.4 mpl.rcParams.update({'font.size':15}) mpl.rcParams.update({'legend.columnspacing':0.5}) ####################

我正试图制作一个这样的情节

使用matplotlib

目前我有这个图:

它是使用以下代码生成的:

import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd

width = 0.4
mpl.rcParams.update({'font.size':15})
mpl.rcParams.update({'legend.columnspacing':0.5})

##############################################################
# BEGIN: Prepare data                                        #
##############################################################
energy_cm = 1550835.86856494
energy_fm = 1456129.29966378
energy_cm_trad = 1393026.50949191
energy_fm_trad = 1314814.95236864
energy_cm_hw = 1200000
energy_fm_hw = 1100000

data_energy = { 'Algorithm' : ['Algorithm 1', 'Algorithm 2'],
       'SW' : [energy_cm, energy_fm],
       'HW' : [energy_cm_hw, energy_fm_hw],
       'Trad' : [energy_cm_trad, energy_fm_trad]
    }

df_energy = pd.DataFrame(data_energy)

##############################################################
# END: Prepare data                                          #
##############################################################

##############################################################
# BEGIN: Split the bars into two halves                      #
##############################################################
fig, (ax, ax2) = plt.subplots(2, 1, sharex=True)

df_energy[['Algorithm', 'SW', 'Trad',
           'HW']].set_index('Algorithm').plot(kind='bar', legend=True,
                                              width=width, rot=0,
                                              ax=ax,
                                              color=('sandybrown','rosybrown',
                                                     'goldenrod','indianred','tomato','r'))

df_energy[['Algorithm', 'SW', 'Trad',
           'HW']].set_index('Algorithm').plot(kind='bar',
                                              legend=False,
                                              width=width, rot=0,
                                              ax=ax2,
                                              color=('sandybrown','rosybrown',
                                                     'goldenrod','indianred','tomato','r'))

max_lengths = sorted(df_energy.max(axis=0).values[1:])
min_lengths = sorted(df_energy.min(axis=0).values[1:])

# zoom-in / limit the view to different portions of the data
ax.set_ylim(max_lengths[-2] * 0.8, max_lengths[-1] * 1.1)  # outliers only
ax2.set_ylim(0, min_lengths[0] * 1.1)  # most of the data

# hide the spines between ax and ax2
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax.xaxis.tick_top()
ax.tick_params(labeltop='off')  # don't put tick labels at the top
ax2.xaxis.tick_bottom()

d = .01  # how big to make the diagonal lines in axes coordinates
# arguments to pass to plot, just so we don't keep repeating them
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
ax.plot((-d, +d), (-d, +d), **kwargs)        # top-left diagonal
ax.plot((1 - d, 1 + d), (-d, +d), **kwargs)  # top-right diagonal

kwargs.update(transform=ax2.transAxes)  # switch to the bottom axes
ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs)  # bottom-left diagonal
ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)  # bottom-right diagonal

##############################################################
# END: Split the bars into two halves                        #
##############################################################

##############################################################
# BEGIN: Labels                                              #
##############################################################
# Remove X lables from the upper half of the plot
ax.tick_params(
    axis='x',          # changes apply to the x-axis
    which='both',      # both major and minor ticks are affected
    bottom=False,      # ticks along the bottom edge are off
    top=False,         # ticks along the top edge are off
    labeltop=False,
    labelbottom=False) # labels along the bottom edge are off

ax.set_ylabel('Energy in nJ')
ax.set_xlabel("")
ax2.set_xlabel("")

##############################################################
# END: Labels                                                #
##############################################################

##############################################################
# BEGIN: Scaling                                             #
##############################################################
mf = mpl.ticker.ScalarFormatter(useMathText=True)
mf.set_powerlimits((-2,2))
ax.yaxis.set_major_formatter(mf)
ax2.yaxis.set_major_formatter(mf)

##############################################################
# END: Scaling                                               #
##############################################################

fig.tight_layout()
plt.show()

我正在为断开的轴使用MatPlotLib,并使用中的代码来缩放y轴上的数字

我想:

  • 从下部子批次中移除缩放标签
  • 减小上下副焊点之间的距离
  • 向下移动y标签,使其同时应用于上部和下部子批次
因此,结果看起来就像这个问题中的第一个图像

我怎样才能做到这三件事?感谢任何帮助,即使它不能解决所有三个问题……

  • 用于更改两个轴之间的间距
  • 我将
    ylabel
    替换为
    fig.text()
    ,使标签在图中垂直居中
  • 使用
    ax2.yaxis.get\u offset\u text().设置可见(False)
    隐藏底部轴上的指数
请注意,轴的限制选择不当,因为“Count Min”类别中的HW条顶部在底部和顶部轴中都可见

完整代码:

import matplotlib.pyplot as plt
import matplotlib as mpl
import pandas as pd

width = 0.4
mpl.rcParams.update({'font.size':15})
mpl.rcParams.update({'legend.columnspacing':0.5})


# BEGIN: Prepare data 
energy_cm = 1550835.86856494
energy_fm = 1456129.29966378
energy_cm_trad = 1393026.50949191
energy_fm_trad = 1314814.95236864
energy_cm_hw = 1200000
energy_fm_hw = 1100000

data_energy = { 'Algorithm' : ['Algorithm 1', 'Algorithm 2'],
       'SW' : [energy_cm, energy_fm],
       'HW' : [energy_cm_hw, energy_fm_hw],
       'Trad' : [energy_cm_trad, energy_fm_trad]
    }

df_energy = pd.DataFrame(data_energy)


# BEGIN: Split the bars into two halves
fig, (ax, ax2) = plt.subplots(2, 1, sharex=True)
kw = dict(width=width, rot=0,
          color=('sandybrown','rosybrown','goldenrod','indianred','tomato','r'))
df_energy[['Algorithm', 'SW', 'Trad',
           'HW']].set_index('Algorithm').plot(kind='bar', legend=True, ax=ax, **kw)

df_energy[['Algorithm', 'SW', 'Trad',
           'HW']].set_index('Algorithm').plot(kind='bar', legend=False, ax=ax2, **kw)

max_lengths = sorted(df_energy.max(axis=0).values[1:])
min_lengths = sorted(df_energy.min(axis=0).values[1:])

# zoom-in / limit the view to different portions of the data
ax.set_ylim(max_lengths[-2] * 0.8, max_lengths[-1] * 1.1)  # outliers only
ax2.set_ylim(0, min_lengths[0] * 1.1)  # most of the data

# hide the spines between ax and ax2
ax.spines['bottom'].set_visible(False)
ax2.spines['top'].set_visible(False)
ax.xaxis.tick_top()
ax.tick_params(labeltop='off')  # don't put tick labels at the top
ax2.xaxis.tick_bottom()

d = .01  # how big to make the diagonal lines in axes coordinates
# arguments to pass to plot, just so we don't keep repeating them
kwargs = dict(transform=ax.transAxes, color='k', clip_on=False)
ax.plot((-d, +d), (-d, +d), **kwargs)        # top-left diagonal
ax.plot((1 - d, 1 + d), (-d, +d), **kwargs)  # top-right diagonal

kwargs.update(transform=ax2.transAxes)  # switch to the bottom axes
ax2.plot((-d, +d), (1 - d, 1 + d), **kwargs)  # bottom-left diagonal
ax2.plot((1 - d, 1 + d), (1 - d, 1 + d), **kwargs)  # bottom-right diagonal



# BEGIN: Labels
# Remove X lables from the upper half of the plot
ax.tick_params(
    axis='x',          # changes apply to the x-axis
    which='both',      # both major and minor ticks are affected
    bottom=False,      # ticks along the bottom edge are off
    top=False,         # ticks along the top edge are off
    labeltop=False,
    labelbottom=False) # labels along the bottom edge are off

fig.text(0,0.5,'Energy in nJ', rotation=90, va='center', ha='left')
ax.set_xlabel("")
ax2.set_xlabel("")


# BEGIN: Scaling
ax.ticklabel_format(style='sci', axis='y', useOffset=True, scilimits=(0,0))
ax2.ticklabel_format(style='sci', axis='y', useOffset=True, scilimits=(0,0))
ax2.yaxis.get_offset_text().set_visible(False)


fig.tight_layout()
fig.subplots_adjust(hspace=0.05)
plt.show()