Python Pandas绘制了由secondary_y更改的图层顺序(Python Pandas plots layer order changed by secondary_y)

我正在尝试将线图和条形图合并为一个图。 数据源是pandas数据帧。

这是一个演示:

import pandas as pd
test = {"index": range(10), 
        "line": [i**2 for i in range(10)], 
        "bar": [i*10 for i in range(10)]}
test=pd.DataFrame(test)
ax=test.plot(x="index",y="line")
test.plot(x="index",y="bar",color="r",kind="bar",ax=ax)

一切都很好,直到现在,你可以看到线条在酒吧上方。 如果我通过将最后一行改为:右边的二级yaxis请求条形图:

test.plot(x="index",y="bar",color="r",kind="bar",ax=ax, secondary_y=True)

然后,条形线将位于线的顶部,这不是我想要的。

以下是两个图:

仅使用一个y轴 使用左右y轴

我试图首先绘制条形图然后绘制线条,我也尝试使用zorder强制条形图上方的线条,但它们都不起作用。

任何建议或帮助将不胜感激。


I'm trying to merge a line plot and a bar plot into one plot. The data source is a pandas dataframe.

Here is a demo:

import pandas as pd
test = {"index": range(10), 
        "line": [i**2 for i in range(10)], 
        "bar": [i*10 for i in range(10)]}
test=pd.DataFrame(test)
ax=test.plot(x="index",y="line")
test.plot(x="index",y="bar",color="r",kind="bar",ax=ax)

Everything is good until now, you can see the line is above the bars. If I ask the barplot using the secondary yaxis on the right by changing the last line as:

test.plot(x="index",y="bar",color="r",kind="bar",ax=ax, secondary_y=True)

Then the bars will on top of the line which is not what I desired.

Here are the two plots:

Use only one y axis Use both left and right y axis

I tried to plot the bars first and then plot the line and I also tried to use zorder to force the line above the bar but neither of them work.

Any suggestions or help would be appreciated.


原文:https://stackoverflow.com/questions/43397810
2021-12-03 13:12

满意答案

第二个轴将始终位于第一个轴的顶部。 因此,您需要最后绘制线图以使其显示在条形图的顶部。 您可以考虑以下解决方案,该方法将行设置为二级比例:

import pandas as pd
test = {"index": range(10), 
        "line": [i**2 for i in range(10)], 
        "bar": [100*i*10 for i in range(10)]}
test=pd.DataFrame(test)

ax  = test.plot(x="index",y="bar",color="r",kind="bar")
ax2 = test.plot(x="index",y="line", color="b", ax=ax, secondary_y=True)
ax.set_ylabel("bar", color="r")
ax2.set_ylabel("line", color="b")

在此处输入图像描述

如果您想要在图的左侧有线的比例,您可以在之后交换比例:

import pandas as pd
test = {"index": range(10), 
        "line": [i**2 for i in range(10)], 
        "bar": [100*i*10 for i in range(10)]}
test=pd.DataFrame(test)

ax  = test.plot(x="index",y="bar",color="r",kind="bar")
ax2 = test.plot(x="index",y="line", color="b", ax=ax, secondary_y=True)

ax.yaxis.tick_right()
ax2.yaxis.tick_left()
ax.set_ylabel("bar", color="r")
ax2.set_ylabel("line", color="b")
ax.yaxis.set_label_position("right")
ax2.yaxis.set_label_position("left")

在此处输入图像描述


The second axes will always be on top of the first. So you need to plot the line plot last to have it appear on top of the bars. You may consider the following solution, which sets the line to the secondary scale:

import pandas as pd
test = {"index": range(10), 
        "line": [i**2 for i in range(10)], 
        "bar": [100*i*10 for i in range(10)]}
test=pd.DataFrame(test)

ax  = test.plot(x="index",y="bar",color="r",kind="bar")
ax2 = test.plot(x="index",y="line", color="b", ax=ax, secondary_y=True)
ax.set_ylabel("bar", color="r")
ax2.set_ylabel("line", color="b")

enter image description here

If you then want to have the scale for line on the left side of the plot, you can exchange the scales afterwards:

import pandas as pd
test = {"index": range(10), 
        "line": [i**2 for i in range(10)], 
        "bar": [100*i*10 for i in range(10)]}
test=pd.DataFrame(test)

ax  = test.plot(x="index",y="bar",color="r",kind="bar")
ax2 = test.plot(x="index",y="line", color="b", ax=ax, secondary_y=True)

ax.yaxis.tick_right()
ax2.yaxis.tick_left()
ax.set_ylabel("bar", color="r")
ax2.set_ylabel("line", color="b")
ax.yaxis.set_label_position("right")
ax2.yaxis.set_label_position("left")

enter image description here

相关问答

更多

PANDAS绘制多个Y轴(PANDAS plot multiple Y axes)

我认为这可能工作: import matplotlib.pyplot as plt import numpy as np from pandas import DataFrame df = DataFrame(np.random.randn(5, 3), columns=['A', 'B', 'C']) fig, ax = plt.subplots() ax3 = ax.twinx() rspine = ax3.spines['right'] rspine.set_position(('axes...

如何在Python中设置辅助y轴(How to set a secondary y-axis in Python)

从您的示例代码中,您似乎正在使用Pandas内置的绘图功能。 添加第二层的一个选项是直接使用matplotlib,如示例“two_scales.py”中所示 。 它用 import matplotlib.pyplot as plt fig, ax1 = plt.subplots() ax1.plot(df["..."]) # ... ax2 = ax1.twinx() ax2.plot(df["Market"]) ax2.set_ylim([0, 5]) 你可以在哪里改变y限制。 From yo...

熊猫DataFrame如何混合不同比例的条形和线条图(pandas DataFrame how to mix bar and line plots with different scales)

这是否能解决您的问题? fig, ax = plt.subplots() ax2 = ax.twinx() ax.bar(df_eg.index, df_eg["Release"], color=(190/255,190/255,190/255,0.7), label='Release') ax2.plot(df_eg.index, df_eg["Hold"], color='green', label='Hold') ax.set_xticklabels(df_eg.index) ax.lege...

python pandas dataframe groupby values和plots multiple graphs(python pandas dataframe groupby values and plots multiple graphs)

我认为你需要使用crosstab来重塑plot : pd.crosstab(df['GYEAR'], df['CAT']).plot() df2 = pd.crosstab(df['GYEAR'], df['COUNTRY']) df2['Total'] = df2.sum(axis=1) df2.plot() 具有聚合size替代解决方案和通过unstack重塑: df.groupby(['GYEAR','CAT']).size().unstack(fill_value=0).plot() ...

如何使用数据框创建带有secondary_y的条形图(How to create bar chart with secondary_y from dataframe)

不要以为熊猫图表支持这一点。 做了一些手动matplotlib代码..你可以进一步调整它 import pylab as pl fig = pl.figure() ax1 = pl.subplot(111,ylabel='A') #ax2 = gcf().add_axes(ax1.get_position(), sharex=ax1, frameon=False, ylabel='axes2') ax2 =ax1.twinx() ax2.set_ylabel('B') ax1.bar(df.ind...

如何向Pandas分组barplot添加非对称错误栏?(How add asymmetric errorbars to Pandas grouped barplot?)

经过一番试验和错误,我发现了它。 如你所说: matplotlib允许使用yerr=[ylo, yhi]构造的非对称错误yerr=[ylo, yhi] 但事实证明,由于你有两个条形组(即“2015 2Q”和“2016 1Q”),matplotlib形状预期为(2,2,4)或:[组数] x 2 x [数量]每组酒吧]。 这是我的代码,在代码中定义errLo和errHi之后开始: err = [] for col in errLo: # Iterate over bar groups (repres...

使用secondary_y轴绘制groupby数据(Plot groupby data using secondary_y axis)

您可以捕获Pandas plot()命令返回的轴,并再次使用它在右轴上绘制C index=pd.date_range('2011-1-1 00:00:00', '2011-12-31 23:50:00', freq='1h') df=pd.DataFrame(np.random.randn(len(index),3).cumsum(axis=0),columns=['A','B','C'],index=index) df2 = df.groupby(lambda x: x.month) for ...

在Pandas / Python中使用GroupBy进行绘图(Plotting with GroupBy in Pandas/Python)

将groupby stats(mean / plt.fill_between()为新数据帧中的列,然后将新数据帧的index作为plt.fill_between()的x参数plt.fill_between()给我(使用matplotlib 1.3.1测试)。 例如, gdf = df.groupby('Time')[col].describe().unstack() plt.fill_between(gdf.index, gdf['25%'], gdf['75%'], alpha=.5) gdf...

Python Pandas绘制了由secondary_y更改的图层顺序(Python Pandas plots layer order changed by secondary_y)

第二个轴将始终位于第一个轴的顶部。 因此,您需要最后绘制线图以使其显示在条形图的顶部。 您可以考虑以下解决方案,该方法将行设置为二级比例: import pandas as pd test = {"index": range(10), "line": [i**2 for i in range(10)], "bar": [100*i*10 for i in range(10)]} test=pd.DataFrame(test) ax = test.plot(x...

如何在使用辅助y轴时标记y轴?(How to label y-axis when using a secondary y-axis?)

这可以通过在绘制次y-axis之前设置标签来实现。 fig, ax1 = plt.subplots() df['Close'].plot(ax=ax1, color='g', linewidth=1.0) sp['Close'].plot(secondary_y=True, ax=ax1, color='b', linewidth=1.0) ax = df['Close'].plot(); ax.set_ylabel('WLL', fontsize=10); sp['Close'].plot(a...

相关文章

更多

Python:渗透测试开源项目【源码值得精读】

sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XS ...

Mod_python: The Long Story

mod_python: the long story - Grisha Trubetskoy ...

探索 Python,第 1 部分: Python 的内置数值类型

Python 编程语言具有很高的灵活性,它支持多种编程方法,包括过程化的、面向对象的和函数式的。但最重 ...

python2和python3的区别

python2和python3的区别,1.性能 Py3.0运行 pystone benchmark的速 ...

Python基础 缩进和选择

在python中, 去除了i > 0周围的括号,去除了每个语句句尾的分号,还去除了表示块的花括号。多出 ...

Python资源索引 【转载】

原文地址:http://blog.chinaunix.net/uid-25525723-id-3630 ...

python字典操作

python里的字典就像java里的HashMap,以键值对的方式存在并操作,其特点如下:通过键来存取 ...

python top project of 2013

Hi Pythonistas! 测试和调试 Testing & Debuggi ...

【转帖】Python 资源索引

原文地址:http://wiki.woodpecker.org.cn/moin/ObpLovelyPy ...

(转)Python WEB应用框架纵览

原文链接:http://wiki.woodpecker.org.cn/moin/PyWebFrameL ...

最新问答

更多

将十六进制的字符串转换为字符串(Convert hex-encoded String to String)

您希望将十六进制编码的数据用作AES密钥,但数据不是有效的UTF-8序列。 您可以将其解释为ISO Latin编码中的字符串,但AES(key: String, ...)初始化程序将该字符串转换回其UTF-8表示形式,也就是说,您将从开始时获得不同的关键数据。 所以你不应该把它转换成字符串。 使用 extension Data { init?(fromHexEncodedString string: String) } 方法从Swift中进行十六进制/二进制字符串转换,将十六进制编码的

将friendly_id添加到用户模型后,登录后的友好转发不起作用(Friendly forwarding after login doesn't work after adding friendly_id to the user model)

在应用程序控制器中,将redirect_back_or(path)方法更改为此方法。 def redirect_back_or(path) redirect_to session[:forwarding_url] || path session.delete(:forwarding_url) end 你有redirect_to request.referer之前负责将你重定向到最后一个url,即login_url。 我不知道为什么你要定义两个不同的方法

Qt + VS2010:由于 .dll从您的计算机丢失,程序无法启动(Qt + VS2010: The program can't start because .dll is missing from your computer)

您可能需要将有问题的DLL复制到您的可执行文件所在的文件夹中,或者确保DLL位于系统PATH中的文件夹中。 You likely need to copy the DLLs in question to the folder your executable is in, or ensure that the DLLs are located in a folder in the system's PATH.

AutoFixture使用内部setter创建属性(AutoFixture create property with internal setter)

理想情况下 ,测试不应该与类的internal成员交互,因为它们明确地从其公共API中排除 。 相反,这些成员将通过公共API启动的代码路径间接测试。 但是,如果在您的特定情况下这不可行,则可能的解决方法是从测试中明确地为内部属性赋值 。 您可以通过以下两种方式之一来实现: 通过使用InternalsVisibleTo属性将程序集中的所有内部成员公开给测试项目。 通过在特定接口中表示类的可修改状态并明确地实现它。 在您的示例中,选项1将是: // [assembly:InternalsVisib

使用Trigger.IO/PhoneGap在UIWebView中使用focus()事件自动显示键盘(Show keyboard automatically with focus() event in UIWebView using Trigger.IO/PhoneGap)

访问UIWebView不是我们在当前版本的插件中正确公开的东西(但我们很快就会支持)。 现在,如果您想尝试一下,可以添加 extern UIWebView *webView; 在插件文件的顶部,这将使您的API方法中的变量webView可用。 这将很快停止工作,所以我建议你现在只用它来测试一下。 2012年10月更新 : 该应用程序的Web视图现在通过ForgeApp : http : ForgeApp 例如: [ForgeApp sharedApp].webView Access to t

ASP.NET MVC控件(ASP.NET MVC Control)

您可以使用RadComboBox以及此处找到的此telerik社区项目提供的一些小调整。 应该在MVC中都能正常工作。 You can use the RadComboBox along with a little tweaking as provided for by this telerik community project, found here. Should all work fine in MVC.

在后期保存上下文 - 将指针保存到上下文?(Saving Context At a Later Stage - Saving Pointer To Context ? Core Data)

是的,您可以在循环后保存上下文。 它比每次迭代中的保存要好得多。 如果你看一下MagicalRecord src,你会看到MR_contextForCurrentThread总是为相同的线程返回相同的上下文,如果没有上下文的线程,MagicalRecord会创建它。 此外,您不需要传递上下文[_entityClass createInContext:context] ,只需要[_entityClass MR_createEntity] - 它将在当前线程的上下文中创建 Yes, you can

tinyMce函数用于确定弹出窗口是否已打开(tinyMce function to determine if popup is already open)

这是我要去的解决方案: 我似乎已经确认: - windowManager.open()不会像window.open()那样返回对窗口的引用 - windowManager没有内置方法来限制可以打开的实例数。 但它确实有一种方法可以将onClose函数添加到插件窗口:ed.windowManager.onClose.add(function(){alert('Closing!');}); 所以我将在onClick代码中使用一个变量来跟踪弹出窗口是否已被打开和关闭。 onClose函数将该变量标记为

使用nil调用Document.find在mongodb中无效(Calling Document.find with nil is invalid in mongodb)

OrderController #new调用OrderController#current_cart,它运行Cart.find(session [:cart_id])。 在会话开始时没有:cart_id,即session [:cart_id]为nil,你得到上面的Mongoid :: Errors :: InvalidFind异常。 请注意,当您正在抢救ActiveRecord :: RecordNotFound时,您的救援子句不会挽救该异常。 您正在使用Mongoid,而不是ActiveRec

在函数中返回postgresql查询结果(Return postgresql query result in a function)

假设您正在使用nodejs和pg模块。 正如您所说,由于查询功能是异步的,您无法直接将结果返回给调用者。 传统上,在nodejs中,调用者传递一个回调函数来处理结果或错误(如果有的话)。 在Kotlin中,这看起来像: client.query(MY_QUERY_TEMPLATE, params) { err, result -> if (err != null) { // do something with the error }