मैं एक हिस्टोग्राम बनाने के लिए matplotlib का उपयोग कर रहा हूं।
क्या डिब्बे की संख्या के विपरीत मैन्युअल रूप से डिब्बे के आकार को निर्धारित करने का कोई तरीका है?
मैं एक हिस्टोग्राम बनाने के लिए matplotlib का उपयोग कर रहा हूं।
क्या डिब्बे की संख्या के विपरीत मैन्युअल रूप से डिब्बे के आकार को निर्धारित करने का कोई तरीका है?
जवाबों:
वास्तव में, यह काफी आसान है: बिन की संख्या के बजाय आप बिन सीमाओं के साथ एक सूची दे सकते हैं। वे असमान रूप से वितरित किए जा सकते हैं, भी:
plt.hist(data, bins=[0, 10, 20, 30, 40, 50, 100])
यदि आप उन्हें समान रूप से वितरित करना चाहते हैं, तो आप बस सीमा का उपयोग कर सकते हैं:
plt.hist(data, bins=range(min(data), max(data) + binwidth, binwidth))
मूल उत्तर में जोड़ा गया
उपरोक्त लाइन data
केवल पूर्णांक से भरे जाने के लिए काम करती है । जैसा कि मैक्रोकॉसम बताता है, तैरने के लिए आप इसका उपयोग कर सकते हैं:
import numpy as np
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
(data.max() - data.min()) / number_of_bins_you_want
:। + binwidth
बस को बदला जा सकता है 1
कि यह एक अधिक आसानी से समझा उदाहरण बनाने के लिए।
lw = 5, color = "white"
या इसी तरह आवेषण सलाखों के बीच सफेद अंतराल
एन बिन के लिए, बिन किनारों को N + 1 मानों की सूची द्वारा निर्दिष्ट किया जाता है जहां पहला N निचले बिन किनारों को देता है और +1 अंतिम बिन के ऊपरी किनारे को देता है।
कोड:
from numpy import np; from pylab import *
bin_size = 0.1; min_edge = 0; max_edge = 2.5
N = (max_edge-min_edge)/bin_size; Nplus1 = N + 1
bin_list = np.linspace(min_edge, max_edge, Nplus1)
ध्यान दें कि linspace, N_ 1 मान या N बिन में टूटी हुई min_edge से max_edge तक की सरणी बनाता है
मुझे लगता है कि आपके पास न्यूनतम और अधिकतम डेटा की गणना करने के लिए आसान तरीका होगा, फिर गणना करें L = max - min
। तब आप L
वांछित बिन चौड़ाई से विभाजित करते हैं (मैं मान रहा हूं कि बिन आकार से आपका क्या मतलब है) और इस मूल्य की छत को डिब्बे की संख्या के रूप में उपयोग करें।
मुझे चीजों को स्वचालित रूप से और "अच्छे" मूल्यों पर पड़ने के लिए डिब्बे पसंद है। निम्नलिखित काफी अच्छी तरह से काम करता है।
import numpy as np
import numpy.random as random
import matplotlib.pyplot as plt
def compute_histogram_bins(data, desired_bin_size):
min_val = np.min(data)
max_val = np.max(data)
min_boundary = -1.0 * (min_val % desired_bin_size - min_val)
max_boundary = max_val - max_val % desired_bin_size + desired_bin_size
n_bins = int((max_boundary - min_boundary) / desired_bin_size) + 1
bins = np.linspace(min_boundary, max_boundary, n_bins)
return bins
if __name__ == '__main__':
data = np.random.random_sample(100) * 123.34 - 67.23
bins = compute_histogram_bins(data, 10.0)
print(bins)
plt.hist(data, bins=bins)
plt.xlabel('Value')
plt.ylabel('Counts')
plt.title('Compute Bins Example')
plt.grid(True)
plt.show()
परिणाम में बिन आकार के अच्छे अंतराल पर डिब्बे हैं।
[-70. -60. -50. -40. -30. -20. -10. 0. 10. 20. 30. 40. 50. 60.]
desired_bin_size=0.05
, min_boundary=0.850
, max_boundary=2.05
की गणना n_bins
हो जाता है int(23.999999999999993)
जो 23 के बजाय 24 में और इसलिए एक बिन भी कुछ परिणाम नहीं। पूर्णांक रूपांतरण से पहले एक राउंडिंग ने मेरे लिए काम किया:n_bins = int(round((max_boundary - min_boundary) / desired_bin_size, 0)) + 1
मैं मात्रा का उपयोग करने के लिए डिब्बे की वर्दी और नमूने के लिए फिट है:
bins=df['Generosity'].quantile([0,.05,0.1,0.15,0.20,0.25,0.3,0.35,0.40,0.45,0.5,0.55,0.6,0.65,0.70,0.75,0.80,0.85,0.90,0.95,1]).to_list()
plt.hist(df['Generosity'], bins=bins, normed=True, alpha=0.5, histtype='stepfilled', color='steelblue', edgecolor='none')
np.arange(0, 1.01, 0.5)
या मात्रा की सूची को बदल सकते हैं np.linspace(0, 1, 21)
। कोई किनारा नहीं है, लेकिन मुझे लगता है कि बक्से में समान क्षेत्र है, लेकिन एक्स अक्ष में अलग चौड़ाई है?
मेरे पास ओपी के रूप में एक ही मुद्दा था (मुझे लगता है!), लेकिन मैं इसे उस तरीके से काम करने के लिए नहीं पा सका जो कि लास्टलडा ने निर्दिष्ट किया था। मुझे नहीं पता कि मैंने प्रश्न की ठीक से व्याख्या की है, लेकिन मुझे एक और समाधान मिल गया है (यह संभवतः इसे करने का एक बहुत बुरा तरीका है)।
यह वह तरीका था जो मैंने किया था:
plt.hist([1,11,21,31,41], bins=[0,10,20,30,40,50], weights=[10,1,40,33,6]);
जो इसे बनाता है:
तो पहला पैरामीटर मूल रूप से बिन को 'इनिशियलाइज़' करता है - मैं विशेष रूप से एक संख्या बना रहा हूं जो कि मैं डिब्बे पैरामीटर में निर्धारित सीमा के बीच में हूं।
इसे प्रदर्शित करने के लिए, पहले पैरामीटर ([१,११,२१,३१,४१]) में सरणी देखें और दूसरे पैरामीटर में ('0,10,20,30,40,50) पर' डिब्बे 'सरणी दें। :
फिर मैं प्रत्येक बिन के आकार को परिभाषित करने के लिए 'वेट' पैरामीटर का उपयोग कर रहा हूं। यह वेट पैरामीटर के लिए उपयोग की जाने वाली सरणी है: [10,1,40,33,6]।
तो 0 से 10 बिन को मान 10 दिया जाता है, 11 से 20 बिन को 1 का मान दिया जाता है, 21 से 30 बिन को 40 का मूल्य दिया जाता है, आदि।