使用matplotlib绘制点图时,我想偏移重叠的数据点以使它们全部可见.例如,如果我有
CategoryA: 0,0,3,0,5
CategoryB: 5,10,5,5,10
Run Code Online (Sandbox Code Playgroud)
我希望每个CategoryA"0"数据点并排设置,而不是彼此重叠,同时仍然保持不同CategoryB.
在R(ggplot2)中有一个"jitter"选项可以做到这一点.在matplotlib中是否有类似的选项,还是有另一种方法可以导致类似的结果?
编辑:为了澄清, R中的"beeswarm"情节基本上是我的想法,并且pybeeswarm是matplotlib/Python版本的早期但有用的开始.
编辑:添加版本0.7中引入的Seaborn的 Swarmplot,是我想要的一个很好的实现.
我有多个工作表的Excel文件,每个工作表看起来都像这样(但更长):
Sample CD4 CD8
Day 1 8311 17.3 6.44
8312 13.6 3.50
8321 19.8 5.88
8322 13.5 4.09
Day 2 8311 16.0 4.92
8312 5.67 2.28
8321 13.0 4.34
8322 10.6 1.95
Run Code Online (Sandbox Code Playgroud)
第一列实际上是垂直合并的四个单元格.
当我使用pandas.read_excel读取它时,我得到一个如下所示的DataFrame:
Sample CD4 CD8
Day 1 8311 17.30 6.44
NaN 8312 13.60 3.50
NaN 8321 19.80 5.88
NaN 8322 13.50 4.09
Day 2 8311 16.00 4.92
NaN 8312 5.67 2.28
NaN 8321 13.00 4.34
NaN 8322 10.60 1.95
Run Code Online (Sandbox Code Playgroud)
我怎样才能让Pandas了解合并的单元格,或者通过适当的值快速轻松地删除NaN和组?(一种方法是重置索引,逐步查找值并用值替换NaN,传入日期列表,然后将索引设置为列.但似乎应该有一个更简单的方法.)
Seaborn允许定义包含多种颜色的调色板,对于包含多行的图表非常有用.但是,当将调色板设置为具有多种颜色的调色板时,仅使用前六种颜色,之后颜色会再循环,从而难以区分线条.这可以通过显式调用调色板来覆盖,但这不方便.当定义超过6个时,有没有办法强制Seaborn当前调色板不回收颜色?
例:
from matplotlib import pyplot as plt
import pandas as pd
import seaborn as sb
# Define a palette with 8 colors
cmap = sb.blend_palette(["firebrick", "palegreen"], 8)
sb.palplot(cmap)
Run Code Online (Sandbox Code Playgroud)

# Set the current palette to this; only 6 colors are used
sb.set_palette(cmap)
sb.palplot(sb.color_palette() )
Run Code Online (Sandbox Code Playgroud)

df = pd.DataFrame({x:[x*10, x*10+5, x*10+10] for x in range(8)})
fig, (ax1, ax2) = plt.subplots(2,1,figsize=(4,6))
# Using the current palette, colors repeat
df.plot(ax=ax1)
ax1.legend(bbox_to_anchor=(1.2, 1))
# using the palette that defined the current palette, colors don't repeat …Run Code Online (Sandbox Code Playgroud) 我有一个来自网络的大表,通过请求访问并使用BeautifulSoup解析.部分内容如下所示:
<table>
<tbody>
<tr>
<td>265</td>
<td> <a href="/j/jones03.shtml">Jones</a>Blue</td>
<td>29</td>
</tr>
<tr >
<td>266</td>
<td> <a href="/s/smith01.shtml">Smith</a></td>
<td>34</td>
</tr>
</tbody>
</table>
Run Code Online (Sandbox Code Playgroud)
当我使用pd.read_html(tbl)输出将其转换为pandas时是这样的:
0 1 2
0 265 JonesBlue 29
1 266 Smith 34
Run Code Online (Sandbox Code Playgroud)
我需要将信息保留在<A HREF ... >标记中,因为唯一标识符存储在链接中.也就是说,该表应如下所示:
0 1 2
0 265 jones03 29
1 266 smith01 34
Run Code Online (Sandbox Code Playgroud)
我对各种其他输出都很好(例如,jones03 Jones会更有帮助),但唯一ID是至关重要的.
其他单元格中也有html标签,一般情况下我不希望保存这些标签,但如果这是获取uid的唯一方法我可以保留这些标签并在以后清理它们,如果我必须.
有没有一种简单的方法来访问这些信息?
我有一个成对矩阵:
>>> m
a b c d
a 1.0 NaN NaN NaN
b 0.5 1.0 NaN NaN
c 0.6 0.0 1.0 NaN
d 0.5 0.4 0.3 1.0
Run Code Online (Sandbox Code Playgroud)
我想用右下角的值替换右上角的NaN:
>>> m2
a b c d
a 1.0 0.5 0.6 0.5
b 0.5 1.0 0.0 0.4
c 0.6 0.0 1.0 0.3
d 0.5 0.4 0.3 1.0
Run Code Online (Sandbox Code Playgroud)
我可以通过交换列和索引来做到这一点:
cols = m.columns
idxs = m.index
for c in cols:
for i in idxs:
m[i][c] = m[c][i]
Run Code Online (Sandbox Code Playgroud)
但是我的实际数据很慢,而且我确信有一种方法可以一步到位.我知道我可以使用"mT"生成右上角版本,但我不知道如何用非NaN值替换NaN以获得完整的矩阵.在numpy中可能只有一步到位的方法,但我不知道矩阵代数.
我有一些需要平滑的模糊矩形2D图形.一个简化的例子:
fig, ax1 = plt.subplots(1,1, figsize=(3,3))
xs1 = [-0.25, -0.625, -0.125, -1.25, -1.125, -1.25, 0.875, 1.0, 1.0, 0.5, 1.0, 0.625, -0.25]
ys1 = [1.25, 1.375, 1.5, 1.625, 1.75, 1.875, 1.875, 1.75, 1.625, 1.5, 1.375, 1.25, 1.25]
ax1.plot(xs1, ys1)
ax1.set_ylim(0.5,2.5)
ax1.set_xlim(-2,2) ;
Run Code Online (Sandbox Code Playgroud)

我已经尝试了scipy.interpolate.RectBivariateSpline,但显然需要所有点的数据(例如热图)和scipy.interpolate.interp1d但是,合理地说,想要生成1d平滑版本.
什么是平滑这个的适当方法?
编辑以更好地修改/解释我的目标.我不需要线条来完成所有要点; 事实上,我更喜欢他们没有经历所有要点,因为有明确的异常点,"应该"与邻居平均,或类似的方法.我已经包含了一个粗略的手册草图,上面是我的想法.
我是新手使用熊猫,我只是不知道该怎么做:
我正在使用python.我(正确)安装了anaconda.在我的文件中,我只是创建一个DataFrame(首先从read_csv导入它,然后手动重新创建它以确保不是问题).当我打印(数据帧)时,它打印:
km | price
0 | 240000 | 3650
[...]
23 | 61789 | 8290
Run Code Online (Sandbox Code Playgroud)
当我做dataframe.info()时我得到了这个:
class 'pandas.core.frame.DataFrame'
Int64Index: 24 entries, 0 to 23
Data columns (total 2 columns):
km 24 non-null int64
price 24 non-null int64
dtypes: int64(2)
memory usage: 576.0 bytes
Run Code Online (Sandbox Code Playgroud)
哪个是完美的.但我尝试的任何其他简单功能只显示NOTHING.我尝试了dataframe.head(),dataframe ['km'],dataframe [3:6]等.没有错误,我的终端上只有一大碗什么都没有.
编辑以添加示例代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
pd.set_option('max_columns', 50)
#df=pd.read_csv('data.csv')
data = {'km': [240000, 139800, 150500, 185530, 176000, 114800, 166800, 89000, 144500, 84000, 82029, 63060, 74000, 97500, …Run Code Online (Sandbox Code Playgroud) 我有一个包含 ~900 行的数据框;我正在尝试为某些列绘制 KDEplots。在某些列中,大多数值是相同的最小值。当我包含太多最小值时,KDEPlot 会突然停止显示最小值。例如,以下包括 600 个值,其中 450 个是最小值,并且绘图看起来不错:
y = df.sort_values(by='col1', ascending=False)['col1'].values[:600]
sb.kdeplot(y)
Run Code Online (Sandbox Code Playgroud)
但是包括 451 个最小值给出了非常不同的输出:
y = df.sort_values(by='col1', ascending=False)['col1'].values[:601]
sb.kdeplot(y)
Run Code Online (Sandbox Code Playgroud)
最终,我想绘制不同列的双变量 KDEPlots,但我想先了解这一点。
我有一个像这样的pandas数据框:
__PRE__
有大约一千行和六十列.大多数细胞是空的(NaN).我想知道每列中文本的概率是多少,因为不同的列中有文本.例如,这里的小片段会产生如下内容:
__PRE__
这表明Al01柱中有4个命中; 在这两个命中中,没有一个是BBR60列中的命中,2个也是CA07列中的命中,3个是NL219列中的命中.等等.
我可以单步执行每一列并使用值构建一个dict,但这看起来很笨拙.有更简单的方法吗?
如果我的熊猫df看起来像这样(仅更长),请使用Seaborn 0.6.0:
windSpeed windBearing
15.37 165
17.49 161
16.41 154
15.54 164
17.38 162
17.80 0
17.36 181
17.35 181
15.96 175
15.86 157
Run Code Online (Sandbox Code Playgroud)
如何将windBearing绘制为圆形网格,将罗盘方向和windSpeed表示为从中心发出的光线,其速度由射线的长度表示?
我有一个如下所示的数据框:
import pandas as pd
df = pd.DataFrame({'A':['a','b','c','d'],'B':['a','b','c','x'],'C':['y','b','c','d']})
df
A B C
0 a a y
1 b b b
2 c c c
3 d x d
Run Code Online (Sandbox Code Playgroud)
我想识别每行中最常见的字符,并计算与共识的差异总数:
A B C Consensus
0 a a y a
1 b b b b
2 c c c c
3 d x d d
Total 0 1 1 0
Run Code Online (Sandbox Code Playgroud)
运行循环是一种方法,但似乎效率低下:
consensus = []
for idx in df.index:
consensus.append(df.loc[idx].value_counts().index[0])
df['Consensus'] = consensus
Run Code Online (Sandbox Code Playgroud)
(等等)
有没有一种直接的方法来获得共识并从中计算差异?