我正尝试使用以下代码制作Polar热图。
# Plotting the polar plot
from matplotlib.colorbar import ColorbarBase
from matplotlib.colors import LogNorm
import matplotlib.pyplot as plt
cmap = obspy_sequential
# Have defined the variables to be used for pointing to the coordinates
# baz is angular, slow is radial, abs_power is the value at every co-ordinate
# Choose number of fractions in plot (desirably 360 degree/N is an integer!)
N = 72
N2 = 30
abins = np.arange(N + 1) * 360. / N
sbins = np.linspace(0, 3, N2 + 1)
# Sum rel power in bins given by abins and sbins
hist, baz_edges, sl_edges = \
np.histogram2d(baz, slow, bins=[abins, sbins], weights=abs_power)
# Transform to radian
baz_edges = np.radians(baz_edges)
# Add polar and colorbar axes
fig = plt.figure(figsize=(8, 8))
cax = fig.add_axes([0.85, 0.2, 0.05, 0.5])
ax = fig.add_axes([0.10, 0.1, 0.70, 0.7], polar=True)
ax.set_theta_direction(-1)
ax.set_theta_zero_location("N")
dh = abs(sl_edges[1] - sl_edges[0])
dw = abs(baz_edges[1] - baz_edges[0])
# Circle through backazimuth
for i, row in enumerate(hist):
bars = ax.bar((i * dw) * np.ones(N2),
height=dh * np.ones(N2),
width=dw, bottom=dh * np.arange(N2),color=cmap(row / hist.max()))
ax.set_xticks(np.linspace(0, 2 * np.pi, 10, endpoint=False))
ax.set_yticklabels(velocity)
ax.set_ylim(0, 3)
[i.set_color('white') for i in ax.get_yticklabels()]
ColorbarBase(cax, cmap=cmap,
norm=LogNorm(vmin=hist.min(),vmax=hist.max()))
plt.show()
我正在创建多个这样的图,因此我需要将颜色条的范围扩展到超出abs_power数据范围的最大值。 我尝试将vmax和vmin更改为所需的最大-最小目标数字,但它每次都绘制出完全相同的图。彩条上的最大值不断变化,但曲线图不变。为什么会这样呢? 这是它的样子,
此处的实际最大功率比色条中指定的最大功率小得多。仍然可以看到亮黄色的斑点。 PS:对于我提供的任何vmax,vmin值,我都会得到相同的图。
答案 0 :(得分:1)
更改颜色条对主图没有影响。您需要更改[0, 1]
中使用的公式以更改Barplot。 “规范”仅用于此任务。规范将数字范围映射到间隔hist.max()
。映射到大于1的值(即示例中大于my_norm = LogNorm(vmin=hist.min(),vmax=hist.max())
for i, row in enumerate(hist):
bars = ax.bar((i * dw) * np.ones(N2),
height=dh * np.ones(N2),
width=dw, bottom=dh * np.arange(N2),color=cmap(my_norm(row)))
的值)的每个值都被分配了最高的颜色。
要使颜色条反映正确的信息,您需要对图和颜色条使用相同的cmap和相同的范数:
ColorbarBase(cax, cmap=cmap, norm=my_norm)
和
my_norm = LogNorm(vmin=hist.min(), vmax=hist.max()*100)
另一方面,如果您不想显示黄色,则可以尝试使用上面代码中的ColorbarBase
之类的东西。
与其通过plt.colorbar()
创建颜色条,不如使用标准的ScalarMappable
,但可以使用LogNorm
来指示颜色图和使用的规范,这会有所帮助。如果是from matplotlib.cm import ScalarMappable
plt.colorbar(ScalarMappable(cmap=cmap, norm=my_norm), ax=ax, cax=cax)
,它将以对数格式显示刻度。
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
System.out.println("Enter how many numbers you want to enter : ");
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
int k = Integer.parseInt(str);
int arr[] = new int[k];
System.out.println("Enter the numbers : ");
for(int i=0;i<k;i++) {
BufferedReader br1= new BufferedReader(new InputStreamReader(System.in));
str=br1.readLine();
arr[i] = Integer.parseInt(str);
}
findMax(arr);
}
private static void findMax(int[] arr) {
int sum=0,i,count=0,max,min,n;
int len = arr.length;
float avg;
max = arr[0];
min = arr[0];
while(count < len) {
sum += arr[count];
if(min > arr[count])
min = arr[count];
if (max < arr[count])
max = arr[count];
count += 1;
}
avg = sum/len;
System.out.println("\nPrinting the results : \n");
System.out.println("Sum = " +sum);
System.out.println("Average = " +avg);
System.out.println("Maximum = " +max);
System.out.println("Minimum = " +min);
}
}