我正在尝试使用几个不同的库(bokeh、seaborn和matlotlib)在 Python 中绘制绘图,但保持相同的配色方案。我从 bokeh with: 中选择了分类调色板,
from bokeh.palettes import Category10 as palette
然后也在seaborn和中使用了它matplotlib。我的问题是,虽然matplotlib颜色看起来非常相似bokeh(如调色板中定义的),但seaborn显示出比应有的颜色明显更深的颜色(即饱和度较低或不饱和)。我想知道它是否默认对任何配色方案进行某种变暗,以及是否有任何方法可以避免这种情况。下面是使用不同库制作相同条形图的代码
使用bokeh:
source = pd.DataFrame({'names': ['exp_1', 'exp_2'], 'data':[3, 5], 'color':palette[10][:2]})
p = bokeh.plotting.figure(x_range=['exp_1', 'exp_2'], y_range=(0,6), plot_height=500, title="test")
p.vbar(x='names', top='data', width=0.9, legend_field="names", source=source, color='color')
p.xgrid.grid_line_color = None
p.legend.orientation = "horizontal"
p.legend.location = "top_center"
p.xaxis.major_label_text_font_size = '22pt'
p.yaxis.major_label_text_font_size = '22pt'
bokeh.io.show(p)
Run Code Online (Sandbox Code Playgroud)
使用matplotlib:
# same palette both for seaborn and matplotlib …Run Code Online (Sandbox Code Playgroud) 我已经成功安装了 skimage 软件包,但是当我尝试导入
from skimage.feature import graycomatrix, graycoprops
Run Code Online (Sandbox Code Playgroud)
它会导致错误:
cannot import name 'graycomatrix' from 'skimage.feature' (/Users/ain/opt/anaconda3/lib/python3.8/site-packages/skimage/feature/__init__.py)
Run Code Online (Sandbox Code Playgroud) 我有一个关于seaborn的问题kdeplot。可以histplot设置他们想要的统计数据kde(计数、频率、密度、概率),如果与参数一起使用,它也适用于kdeplot. kdeplot但是,如果我只想使用概率进行 kde 图估计,我还没有找到如何直接更改它的方法。histplot或者,如果可以关闭酒吧,应该会得到相同的结果,但我也没有发现。那么如何才能做到这一点呢?
举一些直观的例子,我只想有红色曲线,即。要么将参数传递给kdeplotuse probabilities,要么从 中删除栏histplot:
import seaborn
penguins = sns.load_dataset("penguins")
sns.histplot(data=penguins, x="flipper_length_mm", kde=True, stat="probability", color="r", label="probabilities")
sns.kdeplot(data=penguins, x="flipper_length_mm", color="k", label="kde density")
plt.legend()
Run Code Online (Sandbox Code Playgroud)
多谢。
抱歉,我是 python 和统计新手。我对函数typ中的感到好奇anova_lm()。典型 1、2、3 是什么意思以及它们有何不同?这是所使用的示例代码typ=2。
aov_table = sm.stats.anova_lm(results, typ=2)
aov_table
Run Code Online (Sandbox Code Playgroud) 我有 pandas 数据框,其中我在两个类别(正、负)中嵌套了 4 个类别(50,60,70,80),并且我想使用基于列的 seaborn kdeplot(例如,A_mean...)进行绘图通过...分组。我想要实现的是这个
(这是通过将 pandas 拆分到一个列表来完成的)。我浏览了几篇文章,此代码(Seaborn 中的多个单图与 pandas groupby 数据)适用于一个级别,但如果我想为每个 Game_RS 绘制此代码,则不适用于两个级别:
for i, group in df_hb_SLR.groupby('Condition'):
sns.kdeplot(data=group['A_mean_per_subject'], shade=True, color='blue', label = 'label name')
Run Code Online (Sandbox Code Playgroud)
我尝试使用这个(Seaborn groupby pandas Series),但第一个答案对我不起作用:
sns.kdeplot(df_hb_SLR.A_mean_per_subject, groupby=df_hb_SLR.Game_RS)
AttributeError: 'Line2D' object has no property 'groupby'
Run Code Online (Sandbox Code Playgroud)
以及我无法做出的关键答案。有没有直接来自seaborn的方法或者直接来自pandas Dataframe的更好方法?
我的数据可以在此链接下以 csv 格式访问——数据,我照常加载它们:
df_hb_SLR = pd.read_csv('data.csv')
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助。
我有以下问题:在 df 中,我想选择特定的行和特定的列,并在此选择中获取第一个n元素并为其分配新值。天真地,我认为下面的代码应该可以完成这项工作:
import seaborn as sns
import pandas as pd
df = sns.load_dataset('tips')
df.loc[df.day=="Sun", "smoker"].iloc[:4] = "Yes"
Run Code Online (Sandbox Code Playgroud)
loc和都iloc应该返回 df 的视图,并且该值应该被覆盖。但是,数据框不会改变。为什么?
我知道如何解决这个问题 - 首先使用 来创建一个新的 df loc,然后使用更改值iloc并更新回原始 df (如下所示)。
但是a)我认为这不是最佳的,b)我想知道为什么顶级解决方案不起作用。为什么它返回一个副本而不是视图的视图?
替代解决方案:
df = sns.load_dataset('tips')
tmp = df.loc[df.day=="Sun", "smoker"]
tmp.iloc[:4] = "Yes"
df.loc[df.day=="Sun", "smoker"] = tmp
Run Code Online (Sandbox Code Playgroud)
注意:我已经阅读了文档、这篇非常棒的文章和这个问题,但他们没有解释这一点。df.loc[mask,"z]他们关心的是和链式之间的区别df["z"][mask]。
我试图找出我的代码有什么问题。
我想加载包含 Alpha 通道的图像,官方网站的描述如下:
cv.IMREAD_UNCHANGED:如果设置,则按原样返回加载的图像(带有 Alpha 通道,否则会被裁剪)。
这是我的尝试:
import cv2 as cv
img2 = cv.imread( 'lbj.jpg' , cv.IMREAD_UNCHANGED)
img2.shape
Run Code Online (Sandbox Code Playgroud)
结果显示:(350, 590, 3)
不是应该的吗(350,590,4)?
谢谢!
我一直在玩 plt.legend() 和 ax.legend() 以及来自seaborn本身的图例,我想我错过了一些东西。
我的第一个问题是,有人可以向我解释一下它们是如何结合在一起的,它们是如何工作的,如果我有次要情节,什么比什么更好?意思是我可以设置一个一般定义(例如,在此位置的所有子图中都有这个图例),然后为特定子图覆盖这个定义(例如通过 ax.legend() )?
我的第二个问题很实际,也展示了我的问题。我们以seaborn Smokers数据集来说明一下:
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset("tips")
# define sizes for labels, ticks, text, ...
# as defined here /sf/ask/272998631/
SMALL_SIZE = 10
MEDIUM_SIZE = 14
BIGGER_SIZE = 18
plt.rc('font', size=SMALL_SIZE) # controls default text sizes
plt.rc('axes', titlesize=SMALL_SIZE) # fontsize of the axes title
plt.rc('axes', labelsize=BIGGER_SIZE) # fontsize of the x and y labels
plt.rc('xtick', labelsize=MEDIUM_SIZE) # fontsize of the tick labels
plt.rc('ytick', labelsize=MEDIUM_SIZE) # fontsize …Run Code Online (Sandbox Code Playgroud) 这不是Notebook Validation Failed的副本。
我有一个 Jupyter ntb,它直到最近都运行良好。无论我做什么,我都会遇到那些正在改变的错误(我附上了一些例子),我用 ntb 做什么并不重要(我尝试重新启动内核,重新启动 Jupyter)。此外,它仅发生在此 ntb 中,即使在同一会话中同时运行,也不会发生在其他 ntb 中。我试图搜索,但找不到任何东西。我在 Jupyter 中得到的是:

其中有很多,相似但不同:
The save operation succeeded, but the notebook does not appear to be valid. The validation error was:
Notebook validation failed: Non-unique cell id 'geological-poker' detected. Corrected to 'front-hampshire'.:
"<UNKNOWN>"
Run Code Online (Sandbox Code Playgroud)
或其他:
Notebook validation failed: Non-unique cell id 'medieval-nebraska' detected. Corrected to 'stock-eating'.:
"<UNKNOWN>"
Run Code Online (Sandbox Code Playgroud)
Notebook validation failed: Non-unique cell id 'intense-award' detected. Corrected to 'blocked-garage'.:
"<UNKNOWN>"
Run Code Online (Sandbox Code Playgroud)
我在终端得到的是:
Notebook JSON is invalid: Non-unique cell id …Run Code Online (Sandbox Code Playgroud) 这个问题的灵感来自于R 中 pheatmap 的中断。问题是我是否可以定义我的着色和分箱在seaborn的热图中的“粗糙”程度、连续/离散程度。我找到了一种使用 cmap 和使用的颜色数量来做到这一点的方法(例如,seaborn 热图中的离散图例)。但是,我不知道这些颜色组的分配是如何完成的。
所以问题是,如果我使用 cmap 并强制 seaborn 仅使用一组离散的 colors=bins,数据如何分箱?我怎样才能手动设置它?例如。对于 R,我可以将中断设置为从 0 到 800,步长为 100,并将其传递给“breaks”参数。
中断列表 = seq(0, 800, by = 100)
如果我的比例是线性的,那么使用 cmap 和颜色数量非常简单,但如果我想让 bins=colorbar 对数或只是不等距,我该怎么做?
为了举一个具体的例子,我举一个航班数据集的例子。左边是原来的默认图,右边是我选择 5 种颜色来组成 5 个 bin。那么如何定义这些垃圾箱的边缘呢?我可以重置它们,以便我有例如。垃圾箱 0-200、200-300、300-400、400-600、600 以上?(我故意使用不等的垃圾箱来表达我的意思。)
# choose 5 colours to create 5 bins
cmap = sns.color_palette('rocket', n_colors=5)
# run this without the cmap argument to get the first image
flights = sns.load_dataset("flights")
flights = flights.pivot("month", …Run Code Online (Sandbox Code Playgroud) 我有一个pm2_5数据帧数据,我使用matplotlib scatterplot. 我想在不同的y 值处插入多条水平线,我通过为每个不同的y值手动调用 '''ax.axhline''' 函数来实现。有没有办法让整个过程自动化?
# making a graph with delineated health levels of pm2.5 in the year 2015
fig, ax=plt.subplots(figsize=(10,7));
pm2_5.plot(kind='scatter',x='S_no',y='pm2_5',c='pm2_5',ax=ax, cmap='tab20b');
ax.axhline(y=150,linestyle ='--')
ax.axhline(y=100,linestyle ='--')
ax.axhline(y=200,linestyle ='--')
ax.axhline(y=300,linestyle ='--')
Run Code Online (Sandbox Code Playgroud)
python ×10
seaborn ×5
matplotlib ×3
pandas ×2
anova ×1
dataframe ×1
heatmap ×1
histogram ×1
image ×1
jupyter ×1
legend ×1
opencv ×1
palette ×1
pandas-loc ×1
plot ×1
r ×1
scatter-plot ×1
scikit-image ×1
statsmodels ×1
subplot ×1