我的图表上有太多的刻度线,它们相互碰撞.
如何减少蜱的数量?
例如,我有蜱:
1E-6, 1E-5, 1E-4, ... 1E6, 1E7
Run Code Online (Sandbox Code Playgroud)
我只想要:
1E-5, 1E-3, ... 1E5, 1E7
Run Code Online (Sandbox Code Playgroud)
我已经尝试过了LogLocator
,但是我还没弄清楚这一点.
我的水平颜色条上的标签太靠近了,我不想进一步减小文字大小:
cbar = plt.colorbar(shrink=0.8, orientation='horizontal', extend='both', pad=0.02)
cbar.ax.tick_params(labelsize=8)
Run Code Online (Sandbox Code Playgroud)
我想保留所有刻度,但删除所有其他标签.
我发现的大多数示例都将用户指定的字符串列表传递给cbar.set_ticklabels().我正在寻找一个通用的解决方案.
我玩弄各种变化
cbar.set_ticklabels(cbar.get_ticklabels()[::2])
Run Code Online (Sandbox Code Playgroud)
和
cbar.ax.xaxis.set_major_locator(matplotlib.ticker.MaxNLocator(nbins=4))
Run Code Online (Sandbox Code Playgroud)
但我还没有找到神奇的组合.
我知道必须有一个干净的方法来使用定位器对象.
我想使用以下代码在X轴上绘制一个带有许多刻度的图形:
import pylab
N = 100
data = pylab.np.linspace(0, N, N)
pylab.plot(data)
pylab.xticks(range(N)) # add loads of ticks
pylab.grid()
pylab.tight_layout()
pylab.show()
pylab.close()
Run Code Online (Sandbox Code Playgroud)
结果图如下所示:
正如您所看到的,X轴是一团糟,因为刻度标签的绘制空间太小甚至重叠.
我想在每个刻度标签之间自动创建恒定的空间,无论有多少刻度.因此,我想增加单个刻度之间的空间,从而可能增加绘图的"长度".
请注意,刻度标签可以是可变长度的字符串.
到目前为止我发现的是关于轴和标签之间的间距(这不是我想要的),刻度频率(我已经可以做)和刻度参数(似乎没有任何间距选项).
我可以手动更改图形的大小matplotlib.pyplot.figure(figsize=(a, b))
,但这需要知道刻度线之间的默认间距(据我所知,没有)和刻度标签的最大宽度(以英寸为单位),我没有如何衡量,所以这不是一个选择,在我看来.
我该怎么做才能增加蜱之间的间距?得到一个相当冗长的图像我很好.
我想在Python中制作一个情节,并且x范围显示为pi的倍数.
有没有一个很好的方法来做到这一点,而不是手动?
我正在考虑使用matplotlib,但其他选项都很好.
编辑3:EL_DON的解决方案对我有用:
import matplotlib.ticker as tck
import matplotlib.pyplot as plt
import numpy as np
f,ax=plt.subplots(figsize=(20,10))
x=np.linspace(-10*np.pi, 10*np.pi,1000)
y=np.sin(x)
ax.plot(x/np.pi,y)
ax.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=1.0))
plt.style.use("ggplot")
plt.show()
Run Code Online (Sandbox Code Playgroud)
赠送:
编辑2(在编辑3中解决!):EL_DON的答案似乎不适合我:
import matplotlib.ticker as tck
import matplotlib.pyplot as plt
import numpy as np
f,ax=plt.subplots(figsize=(20,10))
x=np.linspace(-10*np.pi, 10*np.pi)
y=np.sin(x)
ax.plot(x/np.pi,y)
ax.xaxis.set_major_formatter(tck.FormatStrFormatter('%g $\pi$'))
ax.xaxis.set_major_locator(tck.MultipleLocator(base=1.0))
plt.style.use("ggplot")
plt.show()
Run Code Online (Sandbox Code Playgroud)
给我
哪个看起来不对劲
我正在用seaborn绘制一系列的箱形图
sns.boxplot(full_array)
Run Code Online (Sandbox Code Playgroud)
其中full_array
包含200个数组.因此,我在x轴上有200个箱图和刻度,从0到200.
xticks彼此太靠近了,我只想展示其中的一些,例如,每隔20左右标记一次xtick.
每次我对xticks进行采样时,我都会得到错误的标记,因为它们的编号从0到N,单位间距.
例如,ax.xaxis.set_major_locator(ticker.MultipleLocator(20))
我用20行标记xtick,但标签是1,2,3,4而不是20,40,60,80 ......
感谢任何善意帮助的人.
由于图片的原因,问题很长,但实际内容并不多。问题在最下面。
你好,我有一系列 30000 个年龄范围从 21 岁到 74 岁的样本。系列头:
0 24
1 26
2 34
3 37
4 57
Name: AGE, dtype: int64
Run Code Online (Sandbox Code Playgroud)
我使用内置的 Pandas 功能绘制它.plot
:
age_series = original_df['AGE']
fig = plt.figure()
fig.suptitle('Age distribution')
age_series.value_counts().sort_index().plot(kind='bar')
Run Code Online (Sandbox Code Playgroud)
我可以增加条之间的水平宽度,但我不想这样做。相反,我只想使 x 轴标签的子集可见。我尝试使用MaxNLocator
并MultipleLocator
添加这一行:
plt.gca().xaxis.set_major_locator(plt.MaxNLocator(10))
Run Code Online (Sandbox Code Playgroud)
但是,它没有实现我的目标,因为它现在错误地标记了条形图并删除了刻度线(我理解这一点,因为使用这些函数会更改 xticks 对象):
一个丑陋的解决方案是在 xticks 对象内循环:
xticks = plt.gca().xaxis.get_major_ticks()
for i in range(len(xticks)):
if i % 10 != 0:
xticks[i].set_visible(False)
Run Code Online (Sandbox Code Playgroud)
然而我不满意,因为循环太天真了。我希望能够访问 xticks(标签)中的值并对其做出决定,以便能够仅显示 10 个标签的倍数。
这有效(基于这个答案):
for i, l in enumerate(labels): …
Run Code Online (Sandbox Code Playgroud) 我正在使用字符串作为x标签绘制数据.我想控制标签频率,以免文本轴过载.在下面的示例中,我希望每3个刻度只看到一个标签:adgj.
我可以这样做的一种方法是每n个元素用2个空字符串替换my_xticks元素.但我确信它提供了一种更清洁的方法.
这是代码:
import numpy as np
import matplotlib.pyplot as plt
y=np.array([4,4,4,5,5,6,5,5,4,4,4])
x = np.arange(y.shape[0])
my_xticks=['a','b','c','d','e','f','g','h','i','j','k']
plt.xticks(x, my_xticks)
plt.plot(x, y)
Run Code Online (Sandbox Code Playgroud) 我有一个这样的清单:
x = ['alice', 'bob', ...] # len(x) > 100
y = [23, 323, ...] # just some number
plt.plot(x, y)
plt.show()
Run Code Online (Sandbox Code Playgroud)
绘制时,它显示x列表的每个值。有没有一种方法可以只显示某些值,x[0], x[10], ...
但数字仍然相同。
我在网上发现了什么,例如在matplotlib中更改x或y轴上的“刻度频率”?全部基于x轴的值int。当x轴的值为字符串时,我不确定该怎么做。
如您所见,即使我将x轴标签旋转90度,它仍然很拥挤,因此我仍然需要找到一种减少显示的x数量的方法。
我想生成一个matplotlib折线图,其中两个变量分别显示在两个具有匹配网格线的y轴上。除了匹配的网格线部分,这一切都非常简单。以下是一些可复制的片段,包括最佳尝试。可以在末尾找到完整的代码段。
带有初始图的可重现数据框
遵循在matplotlib中向次要y轴添加y轴标签的建议,我可以生成以下代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# Dataframe with some random numbers
np.random.seed(123)
rows = 4
df = pd.DataFrame(np.random.randint(90,110,size=(rows, 2)), columns=list('AB'))
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=rows).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
df['B'] = df['A'] * np.random.uniform(0.6,1.4, size = 4)
# Plot 1
fig, ax = plt.subplots()
t = df.index
ax.plot(t, df['A'])
ax2 = ax.twinx()
ax2.plot(t, df['B'], color='red')
ax2.yaxis.grid(which="major", color='green', linestyle='--')
ax.legend(loc='upper left')
ax2.legend(loc='upper right') …
Run Code Online (Sandbox Code Playgroud) 尽管在SO和Matplotlib的文档中尝试了一些解决方案,我仍然无法禁用Matplotlib在x轴上创建周末日期.
如您所见,它会向x轴添加不在原始Pandas列中的日期.
我正在使用(评论的行不能成功实现我的目标)来绘制我的数据:
fig, ax1 = plt.subplots()
x_axis = df.index.values
ax1.plot(x_axis, df['MP'], color='k')
ax2 = ax1.twinx()
ax2.plot(x_axis, df['R'], color='r')
# plt.xticks(np.arange(len(x_axis)), x_axis)
# fig.autofmt_xdate()
# ax1.fmt_xdata = mdates.DateFormatter('%Y-%m-%d')
fig.tight_layout()
plt.show()
Run Code Online (Sandbox Code Playgroud)
下面是我的Pandas数据框的示例,日期为索引:
2019-01-09 1.007042 2585.898714 4.052480e+09 19.980000 12.07 1
2019-01-10 1.007465 2581.828491 3.704500e+09 19.500000 19.74 1
2019-01-11 1.007154 2588.605258 3.434490e+09 18.190001 18.68 1
2019-01-14 1.008560 2582.151225 3.664450e+09 19.070000 14.27 1
Run Code Online (Sandbox Code Playgroud)
我发现的一些建议包括这里和这里的自定义自动收报机,但是虽然我没有得到错误,但情节缺少我的第二个系列.
有关如何在matplotlib中禁用日期插值的任何建议?
matplotlib ×10
python ×10
axis-labels ×2
pandas ×2
plot ×2
boxplot ×1
dataframe ×1
python-3.x ×1
seaborn ×1