Pandas数据框图:yscale日志和xy标签和图例问题

时间:2016-04-15 14:44:16

标签: python pandas matplotlib

简介

我是python,matplotlib和pandas的新手。我花了很多时间来审查材料以得出以下内容。而且我被困住了。

问题:

我正在尝试使用熊猫进行策划。我有三个Y轴,其中一个是对数刻度。 我无法弄清楚为什么日志函数( 1 )和标签函数( 2 )对代码中的辅助轴ax2不起作用。它适用于其他任何地方。

所有图例都是分开的( 3 )。除手动之外,是否有更简单的方法来处理此问题。

当我绘制次轴部分时,单独出来很好。我跑了删除第三轴的情节,仍然存在问题。我把所有轴的代码放在这里,因为我需要建议以这种方式一起工作的解决方案。

Here方法仅用于解决( 3 ),但我特别关注基于数据帧的绘图。在同一站点中也提供了其他手动技术,我不想使用它们!

enter image description here

代码和说明

# Importing the basic libraries
import matplotlib.pyplot as plt
from pandas import DataFrame

# test3 = Dataframe with 5 columns
test3 = df.ix[:,['tau','E_tilde','Max_error_red','time_snnls','z_t_gandb']]

# Setting up plot with 3 'y' axis
fig, ax = plt.subplots()
ax2, ax3 = ax.twinx(), ax.twinx()
rspine = ax3.spines['right']
rspine.set_position(('axes', 1.25))
ax3.set_frame_on(True)
ax3.patch.set_visible(False)
fig.subplots_adjust(right=0.75)

# Setting the color and labels
ax.set_xlabel('tau(nounit)')
ax.set_ylabel('Time(s)', color = 'b')
ax2.set_ylabel('Max_error_red', color = 'r')
ax3.set_ylabel('E_tilde', color = 'g')

# Setting the logscaling
ax.set_xscale('log') # Works 
ax2.set_yscale('log')# Doesnt work

# Plotting the dataframe
test3.plot(x = 'tau', y = 'time_snnls', ax=ax, style='b-')
test3.plot(x = 'tau', y = 'Max_error_red', ax=ax2, style='r-', secondary_y=True)
test3.plot(x = 'tau', y = 'z_t_gandb', ax=ax, style='b-.')
test3.plot(x = 'tau', y = 'E_tilde', ax=ax3, style='g-')

1 个答案:

答案 0 :(得分:1)

问题是secondary_y=True选项。删除它,它工作正常。我认为问题在于你已经设置了双轴,而secondary_y=True正在干扰它。

对于图例:在每个legend=False命令中设置test3.plot,然后在使用ax.get_legend_handles_labels()创建绘图后从轴收集图例句柄和标签。然后你可以在一个传奇上绘制它们。

最后,为了确保正确设置轴标签,您必须在之后设置它们您已绘制数据,因为pandas DataFrame绘图方法将覆盖您尝试过的任何内容组。通过以后执行此操作,您可以确保它是您设置的标签。

下载工作脚本(带有虚拟数据):

import matplotlib.pyplot as plt
from pandas import DataFrame
import numpy as np

# Fake up some data
test3 = DataFrame({
    'tau':np.logspace(-3,0,100),
    'E_tilde':np.linspace(100,0,100),
    'Max_error_red':np.logspace(-2,1,100),
    'time_snnls':np.linspace(5,0,100),
    'z_t_gandb':np.linspace(16,15,100)
    })

# Setting up plot with 3 'y' axis
fig, ax = plt.subplots()
ax2, ax3 = ax.twinx(), ax.twinx()
rspine = ax3.spines['right']
rspine.set_position(('axes', 1.25))
ax3.set_frame_on(True)
ax3.patch.set_visible(False)
fig.subplots_adjust(right=0.75)

# Setting the logscaling
ax.set_xscale('log') # Works 
ax2.set_yscale('log')# Doesnt work

# Plotting the dataframe
test3.plot(x = 'tau', y = 'time_snnls', ax=ax, style='b-',legend=False)
test3.plot(x = 'tau', y = 'Max_error_red', ax=ax2, style='r-',legend=False)
test3.plot(x = 'tau', y = 'z_t_gandb', ax=ax, style='b-.',legend=False)
test3.plot(x = 'tau', y = 'E_tilde', ax=ax3, style='g-',legend=False)

# Setting the color and labels
ax.set_xlabel('tau(nounit)')
ax.set_ylabel('Time(s)', color = 'b')
ax2.set_ylabel('Max_error_red', color = 'r')
ax3.set_ylabel('E_tilde', color = 'g')

# Gather all the legend handles and labels to plot in one legend
l1 = ax.get_legend_handles_labels()
l2 = ax2.get_legend_handles_labels()
l3 = ax3.get_legend_handles_labels()

handles = l1[0]+l2[0]+l3[0]
labels = l1[1]+l2[1]+l3[1]

ax.legend(handles,labels,loc=5)

plt.show()

enter image description here