Python Pyplot/Matplotlib:如何实现压缩的y轴
我正在使用pyplot创建一个基于Walter/Lieth可视化的climograph 正如您在图像(上面的链接)上看到的,右y轴从值100开始压缩。他们的视距变小,而数字间隔变大 我不知道如何在pyplot中实现这一点。我知道如何设置刻度值来创建自定义比例,但当然它们总是等距的。正如您在我的绘图中所看到的,右y轴上的绘图空间对应于值的间隔: 也许有人可以给一个提示,如何实现上述两个链接中显示的效果 干杯 给你举个例子:Python Pyplot/Matplotlib:如何实现压缩的y轴,python,matplotlib,visualization,data-visualization,Python,Matplotlib,Visualization,Data Visualization,我正在使用pyplot创建一个基于Walter/Lieth可视化的climograph 正如您在图像(上面的链接)上看到的,右y轴从值100开始压缩。他们的视距变小,而数字间隔变大 我不知道如何在pyplot中实现这一点。我知道如何设置刻度值来创建自定义比例,但当然它们总是等距的。正如您在我的绘图中所看到的,右y轴上的绘图空间对应于值的间隔: 也许有人可以给一个提示,如何实现上述两个链接中显示的效果 干杯 给你举个例子: import matplotlib.pyplot as plt ax
import matplotlib.pyplot as plt
axes = plt.axes()
axes.set_xlim([-10, 10]) #whatever, optional
axes.set_ylim([0, 1.0]) # whatever, optional
axes.set_xticks([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5])
axes.set_yticks([0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100,150,200,300])
plt.plot(x, norm.pdf(x)) #random filler
plt.plot(x, norm.pdf(x, 70.0, 0.1)) #another absolutely random filler
plt.show()
我的示例仅显示了如何调整Y坐标刻度,正如您所想的那样。对不起,显然帮不了你什么忙。我一点也不理解否决票。我想可能会有更好的答案
对于样本(数据)的实际压缩,有几种方法:
- 使用函数缩放数据。可能是分步定义的。i、 e.对于0
解决方案 下面是一个基于Attersons答案的解决方案示例。比例函数取自答案 从matplotlib导入pyplot作为plt def刻度(val、src、dst): """ 将给定值从src比例调整为dst比例。 """ 返回((val-src[0])/(src[1]-src[0])*(dst[1]-dst[0])+dst[0] #实际数据 数据=[20,50,100,250,600,200,150,100,40,30,25,20] 源_标度=(100600)#标度值介于100和600之间 目的地_标度=(100150)#标度介于100和150之间 #对大于或等于100的所有数据项应用比例 数据刻度=[x如果x<100,则x为数据中x的其他刻度(x,源刻度,目标刻度)] #设置一个简单的绘图 图=plt.图() ax=plt.轴(图[0,0,1,1]) 图添加_轴(ax) #将y记号设置为自定义比例 ax.集合校验([0,20,40,60,801001010120130140150]) ax.set_ylim(0,150) #将标签设置为实际值 ax.设置标签([“0”、“20”、“40”、“60”、“80”、“100”、“200”、“300”、“400”、“500”、“600”)) ax.绘图(数据/比例)
谢谢您的回答!也许我对我的问题描述不够清楚。我知道如何调整y轴刻度。我不知道的是如何调整它,以实现轴的压缩,如我所发布的。在我的示例绘图和您的示例代码中,间隔的大小对应于刻度之间的绘图空间。在我发布的链接中,刻度之间的间隔保持不变,尽管间隔变大了。我希望我能澄清我的意图。好的,我添加了一个链接,用于查看日志刻度。或者,您可以重新标记记号,并使用一个函数将数据从域Y1重新缩放到域Y2,甚至可以重新缩放组合谢谢!我按照你的建议使用了一个函数来缩放数据。成功了。我在我的原始帖子中添加了一个示例解决方案!请不要在问题中提供答案。相反,你可以回答自己的问题。我现在是为你做的。from matplotlib import pyplot as plt def scale(val, src, dst): """ Scale the given value from the scale of src to the scale of dst. """ return ((val - src[0]) / (src[1]-src[0])) * (dst[1]-dst[0]) + dst[0] # Actual data data = [20, 50, 100, 250, 600, 200, 150, 100, 40, 30, 25, 20] source_scale = (100, 600) # Scale values between 100 and 600 destination_scale = (100, 150) # to a scale between 100 and 150 # Apply scale to all items of data that are above or equal to 100 data_scaled = [x if x < 100 else scale(x, source_scale, destination_scale) for x in data] # Set up a simple plot fig = plt.figure() ax = plt.Axes(fig, [0.,0.,1.,1.]) fig.add_axes(ax) # Set the y-ticks to a custom scale ax.set_yticks([0,20,40,60,80,100,110,120,130,140,150]) ax.set_ylim(0, 150) # Set the labels to the actual values ax.set_yticklabels(["0","20","40","60","80","100","200","300","400","500","600"]) ax.plot(data_scaled)