gpt4 book ai didi

python - 如何在 log-log sns.regplot 中实现直线回归线

转载 作者:行者123 更新时间:2023-12-04 08:48:22 29 4
gpt4 key购买 nike

我正在尝试在 Python 中重新创建这个用 R 创建的图:

enter image description here

这是我得到的:

enter image description here

这是我使用的代码:

from matplotlib.ticker import ScalarFormatter

fig, ax = plt.subplots(figsize=(10,8))

sns.regplot(x='Platform2',y='Platform1',data=duplicates[['Platform2','Platform1']].dropna(thresh=2), scatter_kws={'s':80, 'alpha':0.5})
plt.ylabel('Platform1', labelpad=15, fontsize=15)
plt.xlabel('Platform2', labelpad=15, fontsize=15)
plt.title('Sales of the same game in different platforms', pad=30, size=20)

ax.set_xscale('log')
ax.set_yscale('log')
ax.set_xticks([1,2,5,10,20])
ax.set_yticks([1,2,5,10,20])
ax.get_xaxis().set_major_formatter(ScalarFormatter())
ax.get_yaxis().set_major_formatter(ScalarFormatter())
ax.set_xlim([0.005, 25.])
ax.set_ylim([0.005, 25.])

plt.show()

我想我在此处绘制的对数值背后缺少一些概念性知识。由于我没有更改值本身,而是更改了图表的比例,所以我认为我做错了什么。当我尝试自己更改值时,我没有成功。

我想要的是像 R 图中那样显示回归线,并在 x 和 y 轴上显示 0。该图的对数性质不允许我在 x 和 y 轴上添加 0 限制。我找到了这个 StackOverflow 条目:LINK但我无法让它发挥作用。也许如果有人可以重新措辞,或者如果有人对如何前进有任何建议,那就太好了!

谢谢!

最佳答案

Seaborn 的 regplot 创建线性空间中的一条线 (y ~ x),或(使用 logx=True)线性回归形式 y ~ log(x)。您的问题要求进行 log(y) ~ log(x) 形式的线性回归。

这可以通过使用输入数据的 log 调用 regplot 来完成。但是,这将更改数据轴,显示数据的 log 而不是数据本身。使用特殊的刻度格式化程序(获取值的权力),这些刻度值可以再次转换为原始数据格式。

请注意,对 set_xticks()set_xlim() 的调用都需要将它们的值转换为日志空间才能工作。需要删除对 set_xscale('log') 的调用。

下面的代码也是changes大多数 plt.ax. 的调用,并将 ax 作为参数添加到 sns.regplot(..., ax=斧)

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set()
p1 = 10 ** np.random.uniform(-2, 1, 1000)
p2 = 10 ** np.random.uniform(-2, 1, 1000)
duplicates = pd.DataFrame({'Platform1': 0.6 * p1 + 0.4 * p2, 'Platform2': 0.1 * p1 + 0.9 * p2})

fig, ax = plt.subplots(figsize=(10, 8))

data = duplicates[['Platform2', 'Platform1']].dropna(thresh=2)
sns.regplot(x=np.log10(data['Platform2']), y=np.log10(data['Platform1']),
scatter_kws={'s': 80, 'alpha': 0.5}, ax=ax)
ax.set_ylabel('Platform1', labelpad=15, fontsize=15)
ax.set_xlabel('Platform2', labelpad=15, fontsize=15)
ax.set_title('Sales of the same game in different platforms', pad=30, size=20)

ticks = np.log10(np.array([1, 2, 5, 10, 20]))
ax.set_xticks(ticks)
ax.set_yticks(ticks)
formatter = lambda x, pos: f'{10 ** x:g}'
ax.get_xaxis().set_major_formatter(formatter)
ax.get_yaxis().set_major_formatter(formatter)
lims = np.log10(np.array([0.005, 25.]))
ax.set_xlim(lims)
ax.set_ylim(lims)

plt.show()

example plot

要创建类似于 R 中示例的 jointplot(要设置图形大小,请使用 sns.jointplot(...., height=...) ,图形将始终为正方形):

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

sns.set()
p1 = 10 ** np.random.uniform(-2.1, 1.3, 1000)
p2 = 10 ** np.random.uniform(-2.1, 1.3, 1000)
duplicates = pd.DataFrame({'Platform1': 0.6 * p1 + 0.4 * p2, 'Platform2': 0.1 * p1 + 0.9 * p2})

data = duplicates[['Platform2', 'Platform1']].dropna(thresh=2)
g = sns.jointplot(x=np.log10(data['Platform2']), y=np.log10(data['Platform1']),
scatter_kws={'s': 80, 'alpha': 0.5}, kind='reg', height=10)

ax = g.ax_joint
ax.set_ylabel('Platform1', labelpad=15, fontsize=15)
ax.set_xlabel('Platform2', labelpad=15, fontsize=15)

g.fig.suptitle('Sales of the same game in different platforms', size=20)

ticks = np.log10(np.array([.01, .1, 1, 2, 5, 10, 20]))
ax.set_xticks(ticks)
ax.set_yticks(ticks)
formatter = lambda x, pos: f'{10 ** x:g}'
ax.get_xaxis().set_major_formatter(formatter)
ax.get_yaxis().set_major_formatter(formatter)
lims = np.log10(np.array([0.005, 25.]))
ax.set_xlim(lims)
ax.set_ylim(lims)
plt.tight_layout()
plt.show()

example of jointplot

关于python - 如何在 log-log sns.regplot 中实现直线回归线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64197463/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com