这是我想解决的问题: 我希望能够通过单击绘图以交互方式(i)删除散点(灰点),(ii)添加新的散点。
import matplotlib.pyplot as plt
import numpy as np
fig, ax = plt.subplots(figsize=(16,4))
a = np.sin(range(100))*np.random.normal(20,10,100)
b = [ 5, 15, 25, 30, 40, 50, 75, 85]
aa = plt.plot(range(len(a)),a,color='red')
bb = plt.scatter(b,a[b],color='grey',s=50)
Run Code Online (Sandbox Code Playgroud)
python animation matplotlib event-handling python-interactive
对于某些手稿,我需要将我的图表标签准确地放置在右上角或左上角。标签需要一个边框,边框的厚度应与图形的刺相同。目前我这样做是这样的:
import matplotlib.pyplot as plt
import numpy as np
my_dpi=96
xposr_box=0.975
ypos_box=0.94
nrows=3
Mytext="label"
GLOBAL_LINEWIDTH=2
fig, axes = plt.subplots(nrows=nrows, sharex=True, sharey=True, figsize=
(380/my_dpi, 400/my_dpi), dpi=my_dpi)
fig.subplots_adjust(hspace=0.0001)
colors = ('k', 'r', 'b')
for ax, color in zip(axes, colors):
data = np.random.random(1) * np.random.random(10)
ax.plot(data, marker='o', linestyle='none', color=color)
for ax in ['top','bottom','left','right']:
for idata in range(0,nrows):
axes[idata].spines[ax].set_linewidth(GLOBAL_LINEWIDTH)
axes[0].text(xposr_box, ypos_box , Mytext, color='black',fontsize=8,
horizontalalignment='right',verticalalignment='top', transform=axes[0].transAxes,
bbox=dict(facecolor='white', edgecolor='black',linewidth=GLOBAL_LINEWIDTH))
plt.savefig("Label_test.png",format='png', dpi=600,transparent=True)
Run Code Online (Sandbox Code Playgroud)
所以我用参数控制盒子的位置:
xposr_box=0.975
ypos_box=0.94
Run Code Online (Sandbox Code Playgroud)
如果更改图的宽度,则框的位置也会更改,但是框的顶部和右侧(或左侧)脊线应始终直接位于图形刺的顶部:
import matplotlib.pyplot as plt
import numpy as np
my_dpi=96
xposr_box=0.975 …Run Code Online (Sandbox Code Playgroud) 我使用seaborn制作了上面的图,但我无法将图例正确放置在图之外。请注意,图例在图像右侧被截断。这是真实的样子,我没有手动剪。这是我正在使用的代码:
sns.lineplot(x="Time", y='Anomaly', style='country', hue='region', size='area', sizes=(1., 4), data=df)
# Put the legend out of the figure
plt.subplots_adjust(right=0.2)
plt.legend(bbox_to_anchor=(.95, 1), loc=2, borderaxespad=0.)
plt.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
- 编辑:
这是复制此问题的数据: https://www.dropbox.com/s/w4gd447e22zb5yk/subset.csv ?dl=0
我想指定图例是垂直显示还是水平显示。我的意思不是说Matplotlib图例垂直旋转中描述的图例文本。我的实际案例包括使用小部件指定的任意数量的系列。但是以下示例代表了挑战的要点:
片段:
# Imports
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# data
np.random.seed(123)
x = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
y = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
z = pd.Series(np.random.randn(100),index=pd.date_range('1/1/2000', periods=100)).cumsum()
df = pd.concat([x,y,z], axis = 1)
# plot
ax = plt.subplot()
for col in (df.columns):
plt.plot(df[col])
plt.legend(loc="lower left")
plt.xticks(rotation=90)
plt.show()
Run Code Online (Sandbox Code Playgroud)
情节:
默认布局似乎是垂直的。查看help(ax.legend)和文档的细节,似乎没有一种直接的方法可以将其更改为水平。还是在那里?
编辑-所需的图例:(使用MS Paint)
我正在尝试在 3 列子图下方添加图例。
我尝试了以下方法:
fig, ax = plt.subplots(ncols=3)
ax[0].plot(data1)
ax[1].plot(data2)
ax[2].plot(data3)
ax_sub = plt.subplot(111)
box = ax_sub.get_position()
ax_sub.set_position([box.x0, box.y0 + box.height * 0.1,box.width, box.height * 0.9])
ax_sub.legend(['A', 'B', 'C'],loc='upper center', bbox_to_anchor=(0.5, -0.3),fancybox=False, shadow=False, ncol=3)
plt.show()
Run Code Online (Sandbox Code Playgroud)
然而,这只会创建一个空帧。当我注释掉 ax_sub 部分时,我的子图显示得很好(但没有图例......)...
非常感谢!
我是新来的matplotlib,正在lim步。就是说,我没有找到这个问题的明显答案。
我有一个散点图,希望按组进行着色,看起来像通过循环绘制是滚动的方式。
这是我的可复制示例,基于上面的第一个链接:
import matplotlib.pyplot as plt
import pandas as pd
from pydataset import data
df = data('mtcars').iloc[0:10]
df['car'] = df.index
fig, ax = plt.subplots(1)
plt.figure(figsize=(12, 9))
for ind in df.index:
ax.scatter(df.loc[ind, 'wt'], df.loc[ind, 'mpg'], label=ind)
ax.legend(bbox_to_anchor=(1.05, 1), loc=2)
# plt.show()
# plt.savefig('file.png')
Run Code Online (Sandbox Code Playgroud)
取消注释会plt.show()产生我想要的东西:
到处搜索,看起来就像plt.savefig()是保存文件的方式。如果我重新注释掉plt.show()并plt.savefig()改为运行,则会得到空白的白色图片。这个问题,暗示这是由于show()之前致电引起的savefig(),但我已将其完全注释掉了。另一个问题有一条评论,建议我可以ax直接保存该对象,但这切断了我的图例:
相同的问题也有替代方法使用fig.savefig()。我得到同样的传说。
有这个问题,这似乎有关,但我不密谋DataFrame直接,所以我不知道如何应用答案(这里dtf …
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
sns.set(style="darkgrid")
g = sns.scatterplot(x="Area", y="Rent/Sqft", hue="region", style="availability", data=df)
Run Code Online (Sandbox Code Playgroud)
当我运行它时,我得到以下图。
我想将图例移出情节。我用谷歌搜索并尝试了以下
g.legend(loc='right', bbox_to_anchor=(1.25, 0.5), ncol=1)
plt.show()
Run Code Online (Sandbox Code Playgroud)
但是我没有任何输出。而且,我无法理解对象plt如何连接到我的sns对象
我正在使用Jupyter Notebook,Python 3.6和Seaborn 0.9.0。
我有一个如下表,它存储在名为“data”的 pandas 数据框中。
| 第1栏 | 设备1 | 事件发生率% | % 事件距离 | % 非事件分布 | % 总分布 |
|---|---|---|---|---|---|
| 0 | 安卓 | 3.08 | 27.3 | 32.96 | 32.75 |
| 1 | Chrome操作系统 | 4.05 | 0.47 | 0.42 | 0.43 |
| 2 | 铬操作系统 | 9.95 | 0.23 | 0.08 | 0.09 |
| 3 | Linux | 2.27 | 0.05 | 0.09 | 0.09 |
| 4 | 苹果系统 | 6.43 | 4.39 | 2.45 | 2.52 |
| 5 | 其他的 | 2.64 | 7.41 | 10.48 | 10.36 |
| 6 | 视窗 | 5.7 | 15.89 | 10.08 | 10.3 |
| 7 | iOS系统 | 3.76 | 44.26 | 43.44 | 43.47 |
我正在尝试创建一个所需的seaborn/matplot图表,如下所示,它是在Excel中创建的。
这是我的Python代码:
feature = 'Device1'
fig, ax1 = plt.subplots(figsize=(10,6))
color = 'tab:blue'
title = 'Event rate by ' + feature …Run Code Online (Sandbox Code Playgroud) 我有五个列表,我打算在两个单独的子图中绘制.在子图1中我想要列表1,2,3和4; 在子图2中我想要列表4和5.这些是列表和event_index用于设置x label.
event_index=['event 1','event 2','event 3','event 4','event 5','event 6','event 7','event 8','event 9','event 10']
list1 = [0.7,0.8,0.8,0.9,0.8,0.7,0.6,0.9,1.0,0.9]
list2 = [0.2,0.3,0.1,0.0,0.2,0.1,0.3,0.1,0.2,0.1]
list3 = [0.4,0.6,0.4,0.5,0.4,0.5,0.6,0.4,0.5,0.4]
list4 = [78,87,77,65,89,98,74,94,85,73]
list5 = [16,44,14,55,34,36,76,54,43,32]
Run Code Online (Sandbox Code Playgroud)
为了生成两个子图,我使用以下代码:
fig = plt.figure() #Creates a new figure
ax1 = fig.add_subplot(211) #First subplot: list 1,2,3, and 4
ax2 = ax1.twinx() #Creates a twin y-axis for plotting the values of list 4
line1 = ax1.plot(list1,'bo-',label='list1') #Plotting list1
line2 = ax1.plot(list2,'go-',label='list2') #Plotting list2
line3 = ax1.plot(list3,'ro-',label='list3') #Plotting list3
line4 …Run Code Online (Sandbox Code Playgroud) import matplotlib.pyplot as plt
import numpy as np
x = np.arange(10)
fig = plt.figure()
ax = plt.subplot(111)
for i in xrange(5):
ax.plot(x, i * x, label='$y = %ix$' % i)
ax.legend(bbox_to_anchor=(1.1, 1.05))
plt.show()
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,我遇到了将图例置于任意位置的函数 bbox_to_anchor 。我无法理解该函数的前两个参数,所有文献都说是归一化轴参数。任何机构都可以解释它们是什么以及如何操纵它们吗?