我有一个带有 datetimeIndex 的数据帧和两列带有 int 值的数据帧。我想在同一个图上绘制 Col1 作为条形图,将 Col2 作为线图。
重要的功能是在放大时将 x 轴正确标记为日期时间。我认为使用 DateFormatter 的解决方案不起作用,因为我想要动态 xtick 标签。
import matplotlib.pyplot as plt
import pandas as pd
import datetime as dt
import numpy as np
startDate = dt.datetime(2018,1,1,0,0)
nrHours = 144
datetimeIndex = [startDate + dt.timedelta(hours=x) for x in range(0,nrHours)]
dF = pd.DataFrame(index=datetimeIndex)
dF['Col1'] = np.random.randint(1,3,nrHours)
dF['Col2'] = np.random.randint(3,6,nrHours)
axes = dF[['Col1']].plot(kind='bar')
dF[['Col2']].plot(ax=axes)
Run Code Online (Sandbox Code Playgroud)
看似简单的任务实际上非常具有挑战性。事实上,在网上进行了大量搜索后,我仍然没有找到任何干净的解决方案。
我尝试过使用 pandas 绘图和 matplotlib。主要问题来自条形图,它似乎难以处理日期时间索引(更喜欢整数,在某些情况下它会绘制日期,但采用 Epoch 1970-1-1 样式,相当于 0)。
例如,我有一个df与nan和使用下面的方法来fillna.
import pandas as pd
a = [[2.0, 10, 4.2], ['b', 70, 0.03], ['x', ]]
df = pd.DataFrame(a)
print(df)
df.fillna(int(0),inplace=True)
print('fillna df\n',df)
dtype_df = df.dtypes.reset_index()
Run Code Online (Sandbox Code Playgroud)
OUTPUT:
0 1 2
0 2 10.0 4.20
1 b 70.0 0.03
2 x NaN NaN
fillna df
0 1 2
0 2 10.0 4.20
1 b 70.0 0.03
2 x 0.0 0.00
col type
0 0 object
1 1 float64
2 2 float64
Run Code Online (Sandbox Code Playgroud)
实际上,我希望column 1维持类型int …
生成数据框的系列计算,以提供NaN占总行数的百分比,如下所示:
data = df.isnull().sum()/len(df)*100
RecordID 0.000000
ContactID 0.000000
EmailAddress 0.000000
ExternalID 100.000000
Date 0.000000
Name 0.000000
Owner 67.471362
Priority 0.000000
Status 0.000000
Subject 0.000000
Description 0.000000
Type 0.000000
dtype: float64
Run Code Online (Sandbox Code Playgroud)
我热衷于将其表示为seaborn中的热图sns.heatmap(data),吸引读者关注100%和67%的读者,不幸的是我遇到了此错误
IndexError:条件和输入之间的形状不一致(获取(12,1)和(12,))
完整回溯:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-17-05db696a3a9b> in <module>()
----> 1 sns.heatmap(data)
~\AppData\Local\Programs\Python\Python36-32\lib\site-packages\seaborn\matrix.py in heatmap(data, vmin, vmax, cmap, center, robust, annot, fmt, annot_kws, linewidths, linecolor, cbar, cbar_kws, cbar_ax, square, xticklabels, yticklabels, mask, ax, **kwargs)
515 plotter = _HeatMapper(data, vmin, vmax, cmap, center, robust, annot, …Run Code Online (Sandbox Code Playgroud) 我使用 for 循环在 Bokeh 中创建了多线图(代码如下)。
在输出示例中只有两条曲线。在这种情况下,我可以为每条曲线设置颜色列表。但是,如果我需要绘制大量曲线,如何使用散景调色板之一(例如配对)?我想自动执行此操作,以避免每次增加要绘制的行数时都必须制作颜色列表。
import pandas as pd
import numpy as np
from bokeh.core.properties import value
from bokeh.plotting import figure, show
from bokeh.io import output_notebook
from bokeh.models import ColumnDataSource, CDSView, GroupFilter, HoverTool
from bokeh.palettes import Paired
bokeh_test=pd.read_excel(data, 'bokeh line plot')
display(bokeh_test)
x y
item
A 4 0.0000
A 5 0.0000
A 36 39.8879
A 66 46.2022
A 97 32.9306
A 127 25.7896
A 158 21.9209
A 189 18.6405
B 6 4.4775
B 7 1.1710
B 8 0.0000
B …Run Code Online (Sandbox Code Playgroud) 我在两个不同的系统上使用来自 numpy 的按位运算并得到不同/不一致的结果。经过一番调查,我发现left_shift导致问题的原因。如果我执行以下操作:
xs = [i for i in range(100)]
np.left_shift(xs, xs)
Run Code Online (Sandbox Code Playgroud)
在第一个系统上,我得到:
array([ 0, 2, 8,
24, 64, 160,
384, 896, 2048,
4608, 10240, 22528,
49152, 106496, 229376,
491520, 1048576, 2228224,
4718592, 9961472, 20971520,
44040192, 92274688, 192937984,
402653184, 838860800, 1744830464,
3623878656, 7516192768, 15569256448,
32212254720, 66571993088, 137438953472,
283467841536, 584115552256, 1202590842880,
2473901162496, 5085241278464, 10445360463872,
21440476741632, 43980465111040, 90159953477632,
184717953466368, 378231999954944, 774056185954304,
1583296743997440, 3236962232172544, 6614661952700416,
13510798882111488, 27584547717644288, 56294995342131200,
114841790497947648, 234187180623265792, 477381560501272576,
972777519512027136, 1981583836043018240, 4035225266123964416,
8214565720323784704, -1729382256910270464, -2882303761517117440,
-4611686018427387904, -6917529027641081856, -9223372036854775808,
-9223372036854775808, …Run Code Online (Sandbox Code Playgroud) 我怎么能做出这样的小提琴人物呢?我想包括置信区间
我可以使用下面的代码用四边形绘制分割图,但不能绘制均值和置信度。数据可以在这里找到。https://drive.google.com/file/d/18GrncA2GmJd38tVGZZ5yylR6Cf61XsGp/view?usp=sharing
import matplotlib.pyplot as plt
import seaborn as sns
sns.violinplot(x="six.categories", y="non_poor", hue="year", data=df, split=True,
inner="quart", palette={"2019": "b", "2020": "y"})
sns.despine(left=True)
plt.xticks(np.arange(6),["Nonpoor\nWhite", "Poor\nWhite", "Poor\nBlack", "Nonpoor\nBlack", "Poor\nHispanic", "Nonpoor\nHispanic"])
Run Code Online (Sandbox Code Playgroud) 我遇到了 polyfit 的问题,无法找到解决方案。我有一个双对数图,我尝试在其中进行polyfit。“x”和“y”都没有任何“nan”或“inf”值。当我运行 polyfit 时,我得到的只是 nan
np.polyfit(x,y,1)
Run Code Online (Sandbox Code Playgroud)
结果
array([nan, nan])
Run Code Online (Sandbox Code Playgroud)
想知道是什么原因。我使用的 x 和 y 大小为 524288,因此很难共享。提前致谢。
一直在尝试修改我的情节,以便可以包装 xlabel。
看过类似问题的一些建议。
但我无法在这方面使用它们。
ax.set_xticklabels 代码不会包装标签。
plt.xticks 代码抛出错误 -
AttributeError: 'Text' object has no attribute 'expandtabs'
plt.figure(figsize = (7,5))
ax = sns.countplot(data = df3, x = df3.PaymentMethod, hue = df3.Churn)
#ax.set_xticklabels(ax.get_xticklabels(), ha="right", horizontalalignment = 'center', wrap = True)
plt.xticks([textwrap.fill(label, 10) for label in ax.get_xticklabels()],
rotation = 10, fontsize=8, horizontalalignment="center")
Run Code Online (Sandbox Code Playgroud)
我是 python 的新手,并试图使用以下代码来拟合数据集分布。实际数据是一个列表,包含两列——预测市场价格和实际市场价格。我试图使用,scipy.curve_fit()但它给了我在同一个地方绘制的许多线条。任何帮助表示赞赏。
# import the necessary modules and define a func.
from scipy.optimize import curve_fit
from matplotlib import pyplot as plt
def func(x, a, b, c):
return a * x** b + c
# my data
pred_data = [3.0,1.0,1.0,7.0,6.0,1.0,7.0,4.0,9.0,3.0,5.0,5.0,2.0,6.0,8.0]
actu_data =[ 3.84,1.55,1.15,7.56,6.64,1.09,7.12,4.17,9.45,3.12,5.37,5.65,1.92,6.27,7.63]
popt, pcov = curve_fit(func, pred_data, actu_data)
#adjusting y
yaj = func(pred_data, popt[0],popt[1], popt[2])
# plot the data
plt.plot(pred_data,actu_data, 'ro', label = 'Data')
plt.plot(pred_data,yaj,'b--', label = 'Best fit')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释颜色条的用途和方式吗?我不明白颜色条的重要性,它显示的数字是什么?颜色条上的数字是什么意思?请向我解释... 数据来自 datacamp:两列显示从 1970 年到 2010 年学习生物学和商业的学生百分比。下面的代码生成了一个 2dhist,但我不明白颜色条标签的含义是什么?是百分比吗??
plt.hist2d(data['Biology'], data['Business'], bins=(5,5))
plt.colorbar()
plt.show()
Run Code Online (Sandbox Code Playgroud)

如何为子图中的所有直方图添加全局图例?
下面的代码模仿了一些数据,我希望在图中的某处有一个全局图例。我正在底部思考,但会考虑更好的答案。它可以左对齐、居中或分散。
我如何添加全球图例?我尝试按照此处的fig.legend((v1, v2, v3), ('v1', 'v2', 'v3'), 'lower left')建议使用,但我认为这不适用于直方图。
使用Python 3.8
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
%matplotlib inline
v1=[3,1.1,2,5.2,4.9,2.6,3,0.5]
v2=[6.1,5.2,9.5,4.5]
v3=[0.1,1.4,0.5,1.2]
fig, axes = plt.subplots(4,2, figsize=(6.5,4.0), constrained_layout=True)
fig.suptitle('suptile')
mybins = [0,3,6,9,12]
mylist = [0,1,4,7]
for ii, ax in enumerate(axes.flat):
if ii in mylist:
data = [v1,v2,v3]
colors = ['blue', 'red', 'green']
labels = ['v1', 'v2', 'v3']
else:
data = [v1,v2]
colors = ['blue', 'red']
labels = ['v1', 'v2']
ax.hist(data, color=colors,edgecolor='black', alpha=0.5,
density=False, cumulative=False, …Run Code Online (Sandbox Code Playgroud)