如何在 seaborn stripplot 中设置抖动种子?
How to set seed for jitter in seaborn stripplot?
我正在尝试准确地复制条带图,以便我可以可靠地绘制线条并在其上书写。但是,当我生成带有抖动的条带图时,抖动是随机的,并且阻止我实现我的目标。
我盲目地尝试了一些我在其他 Stack Overflow 帖子中找到的 rcParams
,例如 mpl.rcParams['svg.hashsalt']
,但没有用。我也试过为 random.seed()
设置种子但没有成功。
我 运行ning 的代码如下所示。
import seaborn as sns
import matplotlib.pyplot as plt
import random
plt.figure(figsize=(14,9))
random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = random.randint(1,100)
values.append(n)
sns.stripplot(catagories, values, size=5)
plt.title('Random Jitter')
plt.xticks([0,1,2],[1,2,3])
plt.show()
这段代码生成了一个 stripplot
,就像我想要的那样。但是,如果你 运行 代码两次,由于抖动,你将得到不同的点位置。我正在制作的图表需要抖动才能看起来不荒谬,但我想在图表上写下。然而,没有办法知道 运行 代码之前的点的确切位置,然后每次代码 运行.
都会改变
有什么方法可以为 seaborn 中的抖动设置种子 stripplots
以使其完美重现?
- 抖动由
scipy.stats.uniform
决定
uniform
是 class uniform_gen(scipy.stats._distn_infrastructure.rv_continuous)
- 它是
class rv_continuous(rv_generic)
的子类
- 其中有一个
seed
参数,并使用 np.random
- 因此,使用
np.random.seed()
- 需要在每次剧情前调用。在示例的情况下,
np.random.seed(123)
必须在循环内。
来自 Stripplot 文档字符串
jitter : float, ``True``/``1`` is special-cased, optional
Amount of jitter (only along the categorical axis) to apply. This
can be useful when you have many points and they overlap, so that
it is easier to see the distribution. You can specify the amount
of jitter (half the width of the uniform random variable support),
or just use ``True`` for a good default.
来自 class _StripPlotter
在 categorical.py
- 抖动是用
scipy.stats.uniform
计算的
from scipy import stats
class _StripPlotter(_CategoricalScatterPlotter):
"""1-d scatterplot with categorical organization."""
def __init__(self, x, y, hue, data, order, hue_order,
jitter, dodge, orient, color, palette):
"""Initialize the plotter."""
self.establish_variables(x, y, hue, data, orient, order, hue_order)
self.establish_colors(color, palette, 1)
# Set object attributes
self.dodge = dodge
self.width = .8
if jitter == 1: # Use a good default for `jitter = True`
jlim = 0.1
else:
jlim = float(jitter)
if self.hue_names is not None and dodge:
jlim /= len(self.hue_names)
self.jitterer = stats.uniform(-jlim, jlim * 2).rvs
来自 rv_continuous 文档字符串
seed : {None, int, `~np.random.RandomState`, `~np.random.Generator`}, optional
This parameter defines the object to use for drawing random variates.
If `seed` is `None` the `~np.random.RandomState` singleton is used.
If `seed` is an int, a new ``RandomState`` instance is used, seeded
with seed.
If `seed` is already a ``RandomState`` or ``Generator`` instance,
then that object is used.
Default is None.
将您的代码与 np.random.seed
一起使用
- 所有剧情点都一样
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 3, figsize=(12, 12))
for x in range(6):
np.random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = np.random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = np.random.randint(1,100)
values.append(n)
row = x // 3
col = x % 3
axcurr = axes[row, col]
sns.stripplot(catagories, values, size=5, ax=axcurr)
axcurr.set_title(f'np.random jitter {x+1}')
plt.show()
仅使用 random
- 情节点四处移动
import seaborn as sns
import matplotlib.pyplot as plt
import random
fig, axes = plt.subplots(2, 3, figsize=(12, 12))
for x in range(6):
random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = random.randint(1,100)
values.append(n)
row = x // 3
col = x % 3
axcurr = axes[row, col]
sns.stripplot(catagories, values, size=5, ax=axcurr)
axcurr.set_title(f'random jitter {x+1}')
plt.show()
数据使用 random
,绘图使用 np.random.seed
fig, axes = plt.subplots(2, 3, figsize=(12, 12))
for x in range(6):
random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = random.randint(1,100)
values.append(n)
row = x // 3
col = x % 3
axcurr = axes[row, col]
np.random.seed(123)
sns.stripplot(catagories, values, size=5, ax=axcurr)
axcurr.set_title(f'np.random jitter {x+1}')
plt.show()
我正在尝试准确地复制条带图,以便我可以可靠地绘制线条并在其上书写。但是,当我生成带有抖动的条带图时,抖动是随机的,并且阻止我实现我的目标。
我盲目地尝试了一些我在其他 Stack Overflow 帖子中找到的 rcParams
,例如 mpl.rcParams['svg.hashsalt']
,但没有用。我也试过为 random.seed()
设置种子但没有成功。
我 运行ning 的代码如下所示。
import seaborn as sns
import matplotlib.pyplot as plt
import random
plt.figure(figsize=(14,9))
random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = random.randint(1,100)
values.append(n)
sns.stripplot(catagories, values, size=5)
plt.title('Random Jitter')
plt.xticks([0,1,2],[1,2,3])
plt.show()
这段代码生成了一个 stripplot
,就像我想要的那样。但是,如果你 运行 代码两次,由于抖动,你将得到不同的点位置。我正在制作的图表需要抖动才能看起来不荒谬,但我想在图表上写下。然而,没有办法知道 运行 代码之前的点的确切位置,然后每次代码 运行.
有什么方法可以为 seaborn 中的抖动设置种子 stripplots
以使其完美重现?
- 抖动由
scipy.stats.uniform
决定
uniform
是class uniform_gen(scipy.stats._distn_infrastructure.rv_continuous)
- 它是
class rv_continuous(rv_generic)
的子类
- 其中有一个
seed
参数,并使用np.random
- 因此,使用
np.random.seed()
- 需要在每次剧情前调用。在示例的情况下,
np.random.seed(123)
必须在循环内。
- 需要在每次剧情前调用。在示例的情况下,
来自 Stripplot 文档字符串
jitter : float, ``True``/``1`` is special-cased, optional
Amount of jitter (only along the categorical axis) to apply. This
can be useful when you have many points and they overlap, so that
it is easier to see the distribution. You can specify the amount
of jitter (half the width of the uniform random variable support),
or just use ``True`` for a good default.
来自 class _StripPlotter
在 categorical.py
- 抖动是用
scipy.stats.uniform
计算的
from scipy import stats
class _StripPlotter(_CategoricalScatterPlotter):
"""1-d scatterplot with categorical organization."""
def __init__(self, x, y, hue, data, order, hue_order,
jitter, dodge, orient, color, palette):
"""Initialize the plotter."""
self.establish_variables(x, y, hue, data, orient, order, hue_order)
self.establish_colors(color, palette, 1)
# Set object attributes
self.dodge = dodge
self.width = .8
if jitter == 1: # Use a good default for `jitter = True`
jlim = 0.1
else:
jlim = float(jitter)
if self.hue_names is not None and dodge:
jlim /= len(self.hue_names)
self.jitterer = stats.uniform(-jlim, jlim * 2).rvs
来自 rv_continuous 文档字符串
seed : {None, int, `~np.random.RandomState`, `~np.random.Generator`}, optional
This parameter defines the object to use for drawing random variates.
If `seed` is `None` the `~np.random.RandomState` singleton is used.
If `seed` is an int, a new ``RandomState`` instance is used, seeded
with seed.
If `seed` is already a ``RandomState`` or ``Generator`` instance,
then that object is used.
Default is None.
将您的代码与 np.random.seed
一起使用
- 所有剧情点都一样
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
fig, axes = plt.subplots(2, 3, figsize=(12, 12))
for x in range(6):
np.random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = np.random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = np.random.randint(1,100)
values.append(n)
row = x // 3
col = x % 3
axcurr = axes[row, col]
sns.stripplot(catagories, values, size=5, ax=axcurr)
axcurr.set_title(f'np.random jitter {x+1}')
plt.show()
仅使用 random
- 情节点四处移动
import seaborn as sns
import matplotlib.pyplot as plt
import random
fig, axes = plt.subplots(2, 3, figsize=(12, 12))
for x in range(6):
random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = random.randint(1,100)
values.append(n)
row = x // 3
col = x % 3
axcurr = axes[row, col]
sns.stripplot(catagories, values, size=5, ax=axcurr)
axcurr.set_title(f'random jitter {x+1}')
plt.show()
数据使用 random
,绘图使用 np.random.seed
fig, axes = plt.subplots(2, 3, figsize=(12, 12))
for x in range(6):
random.seed(123)
catagories = []
values = []
for i in range(0,200):
n = random.randint(1,3)
catagories.append(n)
for i in range(0,200):
n = random.randint(1,100)
values.append(n)
row = x // 3
col = x % 3
axcurr = axes[row, col]
np.random.seed(123)
sns.stripplot(catagories, values, size=5, ax=axcurr)
axcurr.set_title(f'np.random jitter {x+1}')
plt.show()